Android Camera OnActivityResult将照片路径重置为空
我在朋友Galaxy S4(GT i9505,Android 5.1)上测试我的应用程序时遇到问题。将文件URI指定给摄像机意图时,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 =
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上调用,或者在您的案例中调用创建的活动上的。