【问题标题】:I'm getting a NullPointerException when I use ACTION_IMAGE_CAPTURE to take a picture当我使用 ACTION_IMAGE_CAPTURE 拍照时出现 NullPointerException
【发布时间】:2012-04-04 11:39:25
【问题描述】:

我有一个相当简单的应用程序,可以从菜单启动相机。相机启动正常,但是当我在拍照后点击确定时,我的 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());
}

【问题讨论】:

    标签: android


    【解决方案1】:

    原来库存相机应用程序不发送 EXTRA_OUTPUT,这就是它为空的原因。但是,一些相机应用程序(如 hero)可以。惊人的。 所以答案是指定EXTRA_OUTPUT。 nexus one 相机应用程序会将图像保存到该位置。然后在 onActivityResult() 检查意图是否为空。如果不是,请使用 data.getData(),如果是,则通过常量使用 EXTRA_OUTPUT 中特定的位置并将其插入 Mediastore。呃。

    【讨论】:

    • 在onActivityResult()中如果intent为null,那么如何获取图片路径@nsheridan
    • @nsheridan - 很抱歉打扰了一个老问题,我遇到了同样的问题,但真的很疯狂,因为我无法让它工作。您能否发布一些代码来展示您的解决方案?提前谢谢...
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 你是对的,这不是一个真正的问题。这是我的问题:谁能帮我查明为什么我会得到一个 data=null 的 npe?我知道意图为空,堆栈跟踪告诉我: ResultInfo{who=null, request=0, result=-1, data=null} 我有 cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempPhotoUri);在上面的代码中也是。我相信这是正确的。
    • 你在 StackOverflow 上看到这个问题了吗? stackoverflow.com/questions/1910608/…
    【解决方案3】:

    基于 nsheridan 的解决方案,我刚刚使我在意图中添加的 fileUri (intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);) 在全班都知道。在 ActivityResult() 中,我检查了 intent == null,如果是,则使用 fileUri 变量,而不是尝试将其从 intent.getData() 中取出。

    现在对我来说很好。

    【讨论】:

      【解决方案4】:

      onActivityResult 在你已经开始的任何活动结束时被调用,所以如果你开始一个不发送数据的活动就会有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多