Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I'm getting a NullPointerException when I use ACTION_IMAGE_CAPTURE to take a picture

Tags:

android

I have a fairly simple app that launches the camera from a menu. The camera launches fine, but when I hit ok after taking a picture I get a NPE on my nexus one:

E/AndroidRuntime( 3891): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {net.asplode.tr/net.asplode.tr.PostImage}: java.lang.NullPointerException
E/AndroidRuntime( 3891):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
E/AndroidRuntime( 3891):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
E/AndroidRuntime( 3891):    at android.app.ActivityThread.access$2800(ActivityThread.java:125)
E/AndroidRuntime( 3891):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
E/AndroidRuntime( 3891):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 3891):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 3891):    at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 3891):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3891):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 3891):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 3891):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime( 3891):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 3891): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 3891):    at net.asplode.tr.PostImage.onActivityResult(PostImage.java:92)
E/AndroidRuntime( 3891):    at android.app.Activity.dispatchActivityResult(Activity.java:3890)
E/AndroidRuntime( 3891):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
E/AndroidRuntime( 3891):    ... 11 more
W/ActivityManager(   85):   Force finishing activity net.asplode.tr/.PostImage

Code:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.mnuCamera) {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        ContentValues values = new ContentValues();
        values.put(Media.TITLE, "image");
        Uri tempPhotoUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempPhotoUri);
        startActivityForResult(cameraIntent, FROM_CAMERA);
        return true;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK) {
        return;
    }
    Uri imageUri = data.getData();
    Log.i("imageUri: ", imageUri.toString());
}
like image 413
Niall Sheridan Avatar asked Jul 18 '10 13:07

Niall Sheridan


3 Answers

Turns out the stock camera application doesn't send EXTRA_OUTPUT, which is why it's null. However, some camera apps (like the hero) do. Awesome. So the answer is to specify EXTRA_OUTPUT. The nexus one camera app will save the image to that location. Then in onActivityResult() check if the intent is null. If it isn't, use data.getData(), and if it is then use the location specific in EXTRA_OUTPUT via a constant and insert it into the Mediastore. Urgh.

like image 72
Niall Sheridan Avatar answered Oct 21 '22 09:10

Niall Sheridan


This doesn't really seem like a question, more like a factual statement. If you are asking what is null, there are two things that can be null:

-The Intent 'data'
-The Uri 'imageUri'

Did you add the Extra, 'EXTRA_OUTPUT', to the Intent? If not, you will only be able to retrieve a small sized image in the Extra field. And this would seem to perhaps be your NPE, happening on 'imageUri'.

http://developer.android.com/reference/android/provider/MediaStore.html#ACTION_IMAGE_CAPTURE

like image 28
nicholas.hauschild Avatar answered Oct 21 '22 10:10

nicholas.hauschild


Based on nsheridan's solution, i just made the fileUri that I added in the intent (intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);) known throughout the class. In the ActivityResult(), I checked whether the intent == null, if so, the fileUri variable is used instead of trying to get it out of the intent.getData().

Works fine for me now.

like image 27
Flep Avatar answered Oct 21 '22 11:10

Flep