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.