1

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

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));

调试器

在此处输入图像描述

如屏幕截图所示,“mFileImgPath”为空,当我在调试器上单击steo 时会跳过 if 条件

4

2 回答 2

2

这是使用内置相机时的已知问题。为了解决这个问题,您必须通过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");
    }
    
  • 不要尝试访问Intentin onActivityResult(int requestCode, int resultCode, Intent data),该参数data很可能会为空。

于 2016-12-18T11:04:24.723 回答
0

当相机应用程序启动时,您的活动可能会被终止。不在前台的活动可以随时被 Android 杀死。

您应该 @overide onSaveInstanceState 并将路径变量的值保存在那里。然后检索 onRestoreInstanceState 中的值。

于 2016-12-18T09:54:24.013 回答