i have an apk app which can take photo and take video with a button.
This is my activity
package com.example.testcamera;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
public class AndroidCameraTestsActivity extends Activity
{
private static final String TAG = AndroidCameraTestsActivity.class.getSimpleName();
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;
private Uri fileUri;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
/**
* https://developer.android.com/guide/topics/media/camera.html
* **/
public void onCaptureImage(View v)
{
// give the image a name so we can store it in the phone's default location
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, "IMG_" + timeStamp + ".jpg");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image (this doesn't work at all for images)
fileUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); // store content values
intent.putExtra( MediaStore.EXTRA_OUTPUT, fileUri);
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
/**
* https://developer.android.com/guide/topics/media/camera.html
* **/
public void onCaptureVideo(View v)
{
//create new Intent
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
//fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); // create a file to save the video in specific folder (this works for video only)
//intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high
// start the Video Capture Intent
startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Originally I was going to iterate through the list of images and grab last added to the MediaStore.
// But this is not necessary if we store the Uri in the image
/*
String[] projection = {MediaStore.Images.ImageColumns._ID};
String sort = MediaStore.Images.ImageColumns._ID + " DESC";
Cursor cursor = this.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, sort);
try{
cursor.moveToFirst();
Long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns._ID));
fileUri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(id));
} finally{
cursor.close();
}
*/
if(fileUri != null) {
Log.d(TAG, "Image saved to:\n" + fileUri);
Log.d(TAG, "Image path:\n" + fileUri.getPath());
Log.d(TAG, "Image name:\n" + getName(fileUri)); // use uri.getLastPathSegment() if store in folder
}
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Video captured and saved to fileUri specified in the Intent
fileUri = (Uri) data.getData();
if(fileUri != null) {
Log.d(TAG, "Video saved to:\n" + fileUri);
Log.d(TAG, "Video path:\n" + fileUri.getPath());
Log.d(TAG, "Video name:\n" + getName(fileUri)); // use uri.getLastPathSegment() if store in folder
}
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the video capture
} else {
// Video capture failed, advise user
}
}
}
/** Create a file Uri for saving an image or video to specific folder
* https://developer.android.com/guide/topics/media/camera.html#saving-media
* */
private static Uri getOutputMediaFileUri(int type)
{
return Uri.fromFile(getOutputMediaFile(type));
}
/** Create a File for saving an image or video */
private static File getOutputMediaFile(int type)
{
// To be safe, you should check that the SDCard is mounted
if(Environment.getExternalStorageState() != null) {
// this works for Android 2.2 and above
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "AndroidCameraTestsFolder");
// This location works best if you want the created images to be shared
// between applications and persist after your app has been uninstalled.
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()) {
if (! mediaStorageDir.mkdirs()) {
Log.d(TAG, "failed to create directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE){
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
} else if(type == MEDIA_TYPE_VIDEO) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"VID_"+ timeStamp + ".mp4");
} else {
return null;
}
return mediaFile;
}
return null;
}
// grab the name of the media from the Uri
protected String getName(Uri uri)
{
String filename = null;
try {
String[] projection = { MediaStore.Images.Media.DISPLAY_NAME };
Cursor cursor = managedQuery(uri, projection, null, null, null);
if(cursor != null && cursor.moveToFirst()){
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME);
filename = cursor.getString(column_index);
} else {
filename = null;
}
} catch (Exception e) {
Log.e(TAG, "Error getting file name: " + e.getMessage());
}
return filename;
}
}
I have first device running the app and I have 2 button, take photo
and take video
.
When I click take video
in this app and it works well but when i click take picture
from the button, the app always "force closes".
this is my error logcat
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): FATAL EXCEPTION: main
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): java.lang.NullPointerException
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): at com.android.camera.Camera.initializeFirstTime(Came ra.java:328)
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): at com.android.camera.Camera.access$1100(Camera.java: 95)
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): at com.android.camera.Camera$MainHandler.handleMessag e(Camera.java:282)
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): at android.os.Handler.dispatchMessage(Handler.java:99 )
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): at android.os.Looper.loop(Looper.java:130)
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): at android.app.ActivityThread.main(ActivityThread.jav a:3683)
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): at java.lang.reflect.Method.invokeNative(Native Method)
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): at java.lang.reflect.Method.invoke(Method.java:507)
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:839)
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:597)
11-19 14:43:27.085: ERROR/AndroidRuntime(6903): at dalvik.system.NativeStart.main(Native Method)
11-19 14:43:27.093: WARN/ActivityManager(1308): Force finishing activity com.android.camera/.Camera
11-19 14:43:27.109: WARN/ActivityManager(1308): Force finishing activity makemachine.android.examples/.PhotoCaptureExample
EDIT : this is my different activity with single app button
package com.example.maincamera;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class OpenCameraDemo extends Activity {
private static final int CAMERA_PIC_REQUEST = 2500;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b = (Button)findViewById(R.id.Button01);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
}
});
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_PIC_REQUEST) {
Bitmap image = (Bitmap) data.getExtras().get("data");
ImageView imageview = (ImageView) findViewById(R.id.ImageView01);
imageview.setImageBitmap(image);
}
}
}
this app still error too, i have tried many app. searching in google.the error still same like my logcat error
When i try to run it on other device, this app works perfectly.
How to fix this, So that i can run and take photos in my first device?
BR.
Alex
The crash is happening inside the device's Camera application, not your own. Unfortunately, because the Camera application on this device could be a heavily customized variation of what is actually in AOSP, it's not entirely clear what the failure is, but here is a link to the source file in the AOSP 2.3.7 source tree where your exception is occurring. The line numbers don't match up exactly to anything of interest, which is what tells me the application on your particular device has been customized at least some.
Any object in the
initializeFirstTime()
method, where the exception occurs, where a method is called could be the source of the issue, but none of this is related to theIntent
parameters your request passes in, so it is doubtful there is much you can do to make this operate appropriately.As a result, you may have better luck implementing the capture functionality yourself in your own application. It is likely that the Android APIs on this device are more stable than the system applications it's bundled with. Here is an example of how you can create your own camera preview and capture Activity.
Thanks @Devunwired, thanks @chintan and thanks all for helping me. i use camera api and it works.
this is my activity
i create home.xml to show button image like my question
main.xml this is a camera preview
and create control.xml take picture button inside camera preview.
but i have 2 problem in this app.
Friend Do one thing.
Make Simple app which have only one button.
onClick
event photo should be capture no add other task.Is it working Properly ?
try to catch the exception and post the message here:
I'm curious about your phone. what the different of them
because of your onCaptureImage(View v) does describe about external storage. but onCaptureVideo(View v) doesn't