当我使用ACTION_IMAGE_CAPTURE来拍照时,我得到一个NullPointerException

时间:2010-07-18 13:46:36

标签: android

我有一个相当简单的应用程序,从菜单启动相机。相机发射很好,但是当我拍完照片后拍到OK时,我的nexus上有一个NPE:

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

代码:

@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());
}

4 个答案:

答案 0 :(得分:6)

原来相机应用程序没有发送EXTRA_OUTPUT,这就是它为空的原因。然而,一些相机应用程序(如英雄)做。真棒。 所以答案是指定EXTRA_OUTPUT。 nexus one相机应用程序会将图像保存到该位置。然后在onActivityResult()中检查intent是否为null。如果不是,请使用data.getData(),如果是,则通过常量使用EXTRA_OUTPUT中的特定位置并将其插入Mediastore。 Urgh。

答案 1 :(得分:3)

这似乎不是一个问题,更像是一个事实陈述。如果你问什么是null,有两件事可以为null:

- 意图“数据”
- TheUri'imageUri'

你有没有将额外的'EXTRA_OUTPUT'添加到Intent?如果没有,您将只能在Extra字段中检索小尺寸图像。这似乎可能是你的NPE,发生在'imageUri'上。

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

答案 2 :(得分:1)

基于nsheridan的解决方案,我刚刚创建了我在整个类中已知的intent(intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);)中添加的fileUri。在ActivityResult()中,我检查了intent == null,如果是,则使用fileUri变量而不是试图将其从intent.getData()中删除。

现在适合我。

答案 3 :(得分:0)

当您已经开始的任何活动结束时,会调用onActivityResult,因此如果您启动不发送数据的活动,则会出现问题。