【问题标题】:MediaStore.EXTRA_OUTPUT always contains null in Landscape modeMediaStore.EXTRA_OUTPUT 在横向模式下始终包含 null
【发布时间】:2016-12-18 09:32:57
【问题描述】:

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

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 over 时,调试器会跳过 if 条件

【问题讨论】:

  • MediaStore.EXTRA_OUTPUT always contains null in Lanscape mode。错误的。不对。您的路径的 String 变量为空。

标签: android camera android-camera onactivityresult startactivityforresult


【解决方案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");
    }
    
  • 不要尝试访问onActivityResult(int requestCode, int resultCode, Intent data)中的Intent,参数data很可能会为空。

【讨论】:

  • 谢谢您..但是您说“不要尝试在 onActivityResult(int requestCode, int resultCode, Intent data) 中访问 Intent,参数数据很可能会为空。” ..为什么它会是空的??
  • 当您启动相机时,它实际上会重新启动您的活动,从而导致您的 uri 为空。
  • 好的。。如果不使用“onRestoreInstanceState”会怎样。只是将我当前的状态保存在“onSaveInstanceState”中,然后在onCreate中从包中获取保存实例??
  • 据我所知putParcelable会将你的uri保存在外部存储机制中,我从来没有访问过onCreate中保存的路径,但是通过onRestoreInstanceState,你可以尝试一下。不过我很确定它会起作用。
  • 实际上我正在尝试通过包发送文件..我按照你的建议使用了“putParcealable”但是Android工作室建议将文件对象转换为 Parcealable 并且在运行时我收到以下信息:java .lang.ClassCastException: java.io.File 无法转换为 android.os.Parcelable
【解决方案2】:

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

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

【讨论】:

  • 你能举个例子吗?
  • 你用谷歌搜索过这些功能吗?你会发现很多例子。
猜你喜欢
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2015-11-18
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多