MediaStore.EXTRA_OUTPUT在横向模式

时间:2016-12-18 09:32:57

标签: android camera android-camera onactivityresult startactivityforresult

我正在尝试打开相机并设置应保存相机图片的路径,如下所示:

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.mFileImgPath))

我遇到的问题是,如果我在相机处于纵向模式时拍摄照片,那么'onActivityResult'将被正常调用,当我检查'mFileImgPath'时,它将不为空。但是,当我使用相同的代码并拍照时 在横向模式下,将调用'onActivityResult'但总是'mFileImgPath'为空。

进一步调用,我使用调试器,如果我试图在Lanscape模式下拍照,'mFileImgPath'总是为空。请看一下调试器的屏幕截图

请让我知道为什么'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));

调试器

enter image description here

如屏幕截图所示,'mFileImgPath'为空,当我点击 steo over 时,调试器会跳过if条件

2 个答案:

答案 0 :(得分:1)

使用内置相机时,这是一个已知问题。为了解决这个问题,你必须通过 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);
    
  • 现在将这两种方法放在您的活动中

          /* 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");
    }
    
  • 请勿尝试访问Intent中的 onActivityResult(int requestCode, int resultCode, Intent data) ,参数data最有可能为空。

    < / LI>

答案 1 :(得分:0)

相机应用程序启动时,您的活动可能会被杀死。任何时候都不会被Android杀死。

你应该@over onSaveInstanceState并保存路径变量的值。然后检索onRestoreInstanceState中的值。