Android Camera OnActivityResult将照片路径重置为空

Android Camera OnActivityResult将照片路径重置为空,android,nullpointerexception,android-camera,uri,onactivityresult,Android,Nullpointerexception,Android Camera,Uri,Onactivityresult,我在朋友Galaxy S4(GT i9505,Android 5.1)上测试我的应用程序时遇到问题。将文件URI指定给摄像机意图时,OnActivityResult会给出结果Activity.result\u OK,路径为null。它在我测试过的大多数其他设备(LG G3、nexus 5…)上都能正常工作。这是我的代码: GetOutputMediaFile public File getOutputMediaFile(int type){ File mediaStorageDir =

我在朋友Galaxy S4(GT i9505,Android 5.1)上测试我的应用程序时遇到问题。将文件URI指定给摄像机意图时,OnActivityResult会给出结果
Activity.result\u OK
,路径为
null
。它在我测试过的大多数其他设备(LG G3、nexus 5…)上都能正常工作。这是我的代码:

GetOutputMediaFile

public File getOutputMediaFile(int type){
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), MediaChooserConstants.folderName);
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MediaChooserConstants.MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
    } else if(type == MediaChooserConstants.MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4");
    } else {
        return null;
    }
    return mediaFile;
}
OnActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {
        String picturePath = null;
        if (requestCode == MediaChooserConstants.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
            picturePath = fileUri.getPath(); // <--- fileURI is null
        }
    }
}
private void dispatchTakePictureIntent() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File file = Utils.getInstance().getOutputMediaFile(MediaChooserConstants.MEDIA_TYPE_IMAGE);

    fileUri = Uri.fromFile(file); // create a file to save the image
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name

    //fileUri is not null here while debugging (../DCIM/.../IMG_XXX.jpg)
    startActivityForResult(intent, MediaChooserConstants.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

}

您需要在
onSaveInstanceState
中保存捆绑包的文件路径,然后在
onRestoreInstanceState
中从捆绑包中再次获取文件路径

您需要在
onSaveInstanceState
中保存捆绑包的文件路径,然后在
onRestoreInstanceState
中从捆绑包中再次获取文件路径

图像的保存路径像这样:

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {

    if(mImageCaptureUri!=null)
        savedInstanceState.putString("camera_image", mImageCaptureUri.toString());

    super.onSaveInstanceState(savedInstanceState);
}
并从以下位置检索图像路径:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {

    if (savedInstanceState != null) {
        if (savedInstanceState.containsKey("camera_image")) {
            mImageCaptureUri = Uri.parse(savedInstanceState.getString("camera_image"));
        }
    }

    super.onRestoreInstanceState(savedInstanceState);
}

只有当用户转到camera intent并且在他捕获图像时,当用户从camera intent返回时,承载camera intent的活动才会被破坏或重新创建,才会发生此问题

像这样保存图像的路径:

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {

    if(mImageCaptureUri!=null)
        savedInstanceState.putString("camera_image", mImageCaptureUri.toString());

    super.onSaveInstanceState(savedInstanceState);
}
并从以下位置检索图像路径:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {

    if (savedInstanceState != null) {
        if (savedInstanceState.containsKey("camera_image")) {
            mImageCaptureUri = Uri.parse(savedInstanceState.getString("camera_image"));
        }
    }

    super.onRestoreInstanceState(savedInstanceState);
}

只有当用户转到camera intent并且在他捕获图像时,当用户从camera intent返回时,承载camera intent的活动才会被破坏或重新创建,才会发生此问题

不需要
ACTION\u IMAGE\u CAPTURE
来返回
Uri
。不需要
ACTION\u IMAGE\u CAPTURE
来返回
Uri
。我会尝试一下,但是您将
Uri
再次放入InstanceState,从而在
恢复InstanceState
中进行了错误的复制/粘贴。提醒大家,因为我是在一个片段中做这件事的(之前没有提到),片段已经在ActivityCreated上创建了
,而不是在RestoreInstanceState上创建了
。我已经根据Activity编辑了我的答案。正如你之前所说,你没有提到“碎片”,而且你是正确的碎片
onActivityCreated
而不是
onrestoreinnstancestate
。顺便说一句,我现在不能在我的朋友设备上测试,但是在我的设备上(没有将uri重置为null),调用了
savedInstanceState
,但是未调用创建的活动上的
onActivityCreated
。这是正常的行为吗?是的,有时是正常的,因为活动的娱乐性取决于手机的性能。如果你在Nexus6上测试这个东西,它可以在没有娱乐的情况下正常工作,但是如果你在MotoG2上测试的话。由于内存和性能问题,它将调用
onrestoreinnstancestate
或在您的情况下调用
onActivityCreated
。我会尝试一下,但您将
URI
再次放入InstanceState,从而在
onrestoreinnstancestate
中进行了错误的复制/粘贴。提醒大家,因为我是在一个片段中做这件事的(之前没有提到),片段已经在ActivityCreated上创建了
,而不是在RestoreInstanceState上创建了
。我已经根据Activity编辑了我的答案。正如你之前所说,你没有提到“碎片”,而且你是正确的碎片
onActivityCreated
而不是
onrestoreinnstancestate
。顺便说一句,我现在不能在我的朋友设备上测试,但是在我的设备上(没有将uri重置为null),调用了
savedInstanceState
,但是未调用创建的活动上的
onActivityCreated
。这是正常的行为吗?是的,有时是正常的,因为活动的娱乐性取决于手机的性能。如果你在Nexus6上测试这个东西,它可以在没有娱乐的情况下正常工作,但是如果你在MotoG2上测试的话。由于内存和性能问题,它将在RestoreInstanceState上调用
,或者在您的案例中调用创建的活动上的