我有一个相当简单的应用程序,从菜单启动相机。相机发射很好,但是当我拍完照片后拍到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());
}
答案 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,因此如果您启动不发送数据的活动,则会出现问题。