调用相机意图后,在onActivityResult中出现NullPointerException

4
这里是我的问题:我需要将照片保存到默认相机位置,然后将其复制到我的私人位置,向副本添加GPS标签,并删除原始照片。为什么要这样做?因为在某些设备上,当使用请求意图中的MediaStore.EXTRA_OUTPUT时,照片仍会保存在默认位置。现在,在应用程序几乎完成之后,当在新设备(Motorola MB526)上测试时,它会在接受拍摄的图片后崩溃。模拟器上也是同样的情况。
问题在于,在onActivityResult(int requestCode, int resultCode, Intent data)中,data.getData()返回null。
因此,我的问题是 - 是否有任何统一的方法可以将图片保存在给定位置而不是其他地方?
编辑:
捕获图像意图
protected void takePhotos() {
    Intent imageIntent = new Intent(
            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(imageIntent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}

和结果

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK && data != null) {
                Uri capturedImageUri = data.getData();
                Log.d("cameraResult", "data =" + data.getDataString());
                String capturedPicFilePath = getRealPathFromURI(capturedImageUri);
                writeImageData(capturedImageUri, capturedPicFilePath);
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "Picture not taken",
                        Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Picture not taken",
                        Toast.LENGTH_SHORT).show();
            }
        }
    }
}

public String getRealPathFromURI(Uri contentUri) {
    String[] projx = { MediaStore.Images.Media.DATA };
    Cursor cursor;
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) {
        CursorLoader loader = new CursorLoader(this, contentUri, projx,
                null, null, null);
        cursor = loader.loadInBackground();
    } else {
        cursor = this.managedQuery(contentUri, projx, null, null, null);
    }
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

logCat 输出:

07-23 18:42:26.486: D/cameraResult(1744): data =null
07-23 18:42:26.486: D/AndroidRuntime(1744): Shutting down VM
07-23 18:42:26.486: W/dalvikvm(1744): threadid=1: thread exiting with uncaught exception (group=0xb70334f0)
07-23 18:42:26.496: E/AndroidRuntime(1744): FATAL EXCEPTION: main
07-23 18:42:26.496: E/AndroidRuntime(1744): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1513, result=-1, data=Intent { act=inline-data (has extras) }} to activity {arios.e_gps/arios.e_gps.photos.PhotoListAct}: java.lang.NullPointerException
07-23 18:42:26.496: E/AndroidRuntime(1744):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at android.app.ActivityThread.access$2000(ActivityThread.java:117)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at android.os.Looper.loop(Looper.java:130)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at android.app.ActivityThread.main(ActivityThread.java:3683)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at java.lang.reflect.Method.invokeNative(Native Method)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at java.lang.reflect.Method.invoke(Method.java:507)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at dalvik.system.NativeStart.main(Native Method)
07-23 18:42:26.496: E/AndroidRuntime(1744): Caused by: java.lang.NullPointerException
07-23 18:42:26.496: E/AndroidRuntime(1744):     at arios.e_gps.photos.PhotoListAct.getRealPathFromURI(PhotoListAct.java:316)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at arios.e_gps.photos.PhotoListAct.onActivityResult(PhotoListAct.java:165)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at android.app.Activity.dispatchActivityResult(Activity.java:3908)
07-23 18:42:26.496: E/AndroidRuntime(1744):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2528)
07-23 18:42:26.496: E/AndroidRuntime(1744):     ... 11 more

1
onActivityResult() 不会返回 null,因为它没有返回任何东西。请发布完整的日志和相关代码。 - codeMagic
1
不是在onActivityResult()方法里,而是在它的内部,data.getData()返回null。 - Kuba Łapuszyński
你的NPE在arios.e_gps.photos.PhotoListAct.getRealPathFromURI(PhotoListAct.java:316)... 另外,为什么要使用托管查询?Loader已经在支持库中了,你不需要额外的代码。 - Steven Byle
是的,它在getRealPathFromURI(Uri contentUri)中。这是由于contentUri为空引起的。它为空是因为getData()返回空。我之前在寻找解决保存在两个位置的照片的方法时发现了这个解决方案。 - Kuba Łapuszyński
2个回答

3

请求缩略图时,Data.getData()不为空。将图片记录到任何位置时,它始终为null。


0

编辑

这可能是错误的,但我用它来获取 ACTION_IMAGE_CAPTURE 后的 URI,对我很有效。

        Bitmap picture = (Bitmap) data.getExtras().get("data");
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        picture.compress(Bitmap.CompressFormat.JPEG, 100, stream);

        String path = Images.Media.insertImage(getContentResolver(), picture,
                "title" , null);
        Uri uriPhoto = Uri.parse(path);

我拼错了logcat输出的第一行。 Log.d("cameraResult", "data =" + data.getDataString()); 在logcat中的结果是 07-23 18:42:26.486: D/cameraResult(1744): data =null。 我知道它不应该是null,但它确实是... - Kuba Łapuszyński
看起来它起了作用。现在我只需要从相册中删除那些照片即可。 - Kuba Łapuszyński

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接