MediaStore.EXTRA_OUTPUT 在横向模式下始终包含 null
MediaStore.EXTRA_OUTPUT always contains null in Landscape mode
我正在尝试打开相机并设置相机图片的保存路径,如下行所示:
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.mFileImgPath))
我遇到的问题是,如果我在相机处于人像模式时拍照,那么 'onActivityResult' 将被正常调用,当我检查 'mFileImgPath' 时它不会为空。但是当我使用相同的代码并拍照时
在横向模式下,将调用 'onActivityResult' 但始终 'mFileImgPath' 为空。
为了进一步调查,我使用了调试器,如果我尝试在 Lanscape 模式下拍照,'mFileImgPath' 始终为 null。请看一下调试器的屏幕截图
请告诉我为什么 'mFileImgPath' 在横向模式下总是为空?以及如何解决它
代码
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
this.mFileImgPath = new File(App.instance.getOutDir() + "/" + new Date().getTime());
Log.e(TAG, "mFileImgPath" + mFileImgPath);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.mFileImgPath));
调试器
如屏幕截图所示,'mFileImgPath' 为空,当我单击 steo over 时,调试器会跳过 if-condition
您的 activity 可以在相机应用程序启动时被杀死。不在前台的活动可以随时被 Android 杀死。
您应该@overide onSaveInstanceState 并将路径变量的值保存在那里。然后检索 onRestoreInstanceState 中的值。
这是使用内置摄像头时的已知问题。为了解决这个问题,您必须通过 onSaveInstanceState() 和 onRestoreInstanceState().
保留 uri
在声明 startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE)
之前,声明 intent.putExtra(..)所以:
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
现在将这 2 个方法放入您的 activity
/* Storing the file url as it'll be null after returning from camera app */
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save file url in bundle as it will be null on scren orientation changes
outState.putParcelable("file_uri", fileUri);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// get the file url
fileUri = savedInstanceState.getParcelable("file_uri");
}
不要尝试访问 onActivityResult(int requestCode, int resultCode, Intent data)
中的 Intent
,参数 data
很可能是null.
我正在尝试打开相机并设置相机图片的保存路径,如下行所示:
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.mFileImgPath))
我遇到的问题是,如果我在相机处于人像模式时拍照,那么 'onActivityResult' 将被正常调用,当我检查 'mFileImgPath' 时它不会为空。但是当我使用相同的代码并拍照时 在横向模式下,将调用 'onActivityResult' 但始终 'mFileImgPath' 为空。
为了进一步调查,我使用了调试器,如果我尝试在 Lanscape 模式下拍照,'mFileImgPath' 始终为 null。请看一下调试器的屏幕截图
请告诉我为什么 'mFileImgPath' 在横向模式下总是为空?以及如何解决它
代码
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
this.mFileImgPath = new File(App.instance.getOutDir() + "/" + new Date().getTime());
Log.e(TAG, "mFileImgPath" + mFileImgPath);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.mFileImgPath));
调试器
如屏幕截图所示,'mFileImgPath' 为空,当我单击 steo over 时,调试器会跳过 if-condition
您的 activity 可以在相机应用程序启动时被杀死。不在前台的活动可以随时被 Android 杀死。
您应该@overide onSaveInstanceState 并将路径变量的值保存在那里。然后检索 onRestoreInstanceState 中的值。
这是使用内置摄像头时的已知问题。为了解决这个问题,您必须通过 onSaveInstanceState() 和 onRestoreInstanceState().
保留 uri在声明
startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE)
之前,声明 intent.putExtra(..)所以:intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
现在将这 2 个方法放入您的 activity
/* Storing the file url as it'll be null after returning from camera app */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // save file url in bundle as it will be null on scren orientation changes outState.putParcelable("file_uri", fileUri); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // get the file url fileUri = savedInstanceState.getParcelable("file_uri"); }
不要尝试访问
onActivityResult(int requestCode, int resultCode, Intent data)
中的Intent
,参数data
很可能是null.