Getting a Null pointer exception when capturing and saving an image using android emulator
I am trying to capture and save an image via android emulator, the image is being captured but the saved file is corrupted.
What could be causing this? can anyone help me identify possible errors?
Below is my code:
**public void onCreate**(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
**Intent** intent = new **Intent**("android.media.action.IMAGE_CAPTURE");
try {
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
intent.putExtra(**MediaStore**.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
@Override
**protected void onActivityResult**(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
StoreImage(this, data.getData(),
mediaFile);
finish();
}
else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
}
else {
finish();
try {
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
Stack trace below ::
04-05 23:55:40.369: E/AndroidRuntime(534): FATAL EXCEPTION: main
04-05 23:55:40.369: E/AndroidRuntime(534): java.lang.RuntimeException: Unable to start activity ComponentInfo{camera.android/camera.android.CameraActivity}: java.lang.NullPointerException: file
04-05 23:55:40.369: E/AndroidRuntime(534): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
04-05 23:55:40.369: E/AndroidRuntime(534): Caused by: java.lang.NullPointerException: file
04-05 23:55:40.369: E/AndroidRuntime(534): at android.net.Uri.fromFile(Uri.java:441)
04-05 23:55:40.369: E/AndroidRuntime(534): at camera.android.CameraActivity.getOutputMediaFileUri(CameraActivity.java:72)
04-05 23:55:40.369: E/AndroidRuntime(534): at camera.android.CameraActivity.onCreate(CameraActivity.java:34)
04-05 23:55:40.369: E/AndroidRuntime(534): at android.app.Activity.performCreate(Activity.java:4465)
04-05 23:55:40.369: E/AndroidRuntime(534): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-05 23:55:40.369: E/AndroidRuntime(534): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
+3
Kanika maheshwari
source
to share
4 answers
check if you have added the following permission in your manifest file ::
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
also in
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
I think you should attach the filename you want to save too and giving only the path is not enough.
+4
Shankar agarwal
source
to share
Change this line,
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
to
if (resultCode == RESULT_OK) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
First check if the child operation was successful or not.
+4
Azhar shaikh
source
to share
"@Agarwal: when calling onActivityResult"
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
StoreImage(this, data.getData(), mediaFile);
finish();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
finish();
try {
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
"If the result is success, then the data from intern is stored in file n, which is created and saved as jpeg format"
public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) {
Bitmap bm = null;
try {
bm = Media.getBitmap(mContext.getContentResolver(), imageLoc);
FileOutputStream out = new FileOutputStream(imageDir);
bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
bm.recycle();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
+1
Kanika maheshwari
source
to share
try under code,
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File file=getOutputMediaFile(1);
picUri = Uri.fromFile(file); // create
i.putExtra(MediaStore.EXTRA_OUTPUT,picUri); // set the image file
startActivityForResult(i, CAPTURE_IMAGE);
where getOutputMediaFile (int) will be,
/** Create a File for saving an image */
private File getOutputMediaFile(int type){
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyApplication");
/**Create the storage directory if it does not exist*/
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
return null;
}
}
/**Create a media file name*/
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == 1){
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".png");
} else {
return null;
}
return mediaFile;
}
and finally
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
Intent i;
switch (requestCode) {
case CAPTURE_IMAGE:
//THIS IS YOUR Uri
Uri uri=picUri;
break;
}
}
}
amuses .... :)
0
Melbourne lopes
source
to share