【问题标题】:Can I capture a video without requiring extra permissions?我可以在不需要额外权限的情况下捕获视频吗?
【发布时间】:2016-05-11 21:28:53
【问题描述】:

我正在尝试使用 MediaStore.ACTION_VIDEO_CAPTURE Intent 操作录制视频。

这将启动相机活动,我可以捕捉视频。问题是我没有权限读取返回的file:// uri:

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    String uriStr = intent.getData().toString();
    /**
    * uriString contains file:/storage/emulated/0/DCIM/Camera/VID_20160511_142405.mp4
    */
    try {
        getContentResolver().openInputStream(intent.getData()).close();
    } catch (IOException e) {
    }
}

我希望相机应用程序能够授予我临时权限,如 http://developer.android.com/guide/topics/providers/content-provider-basics.html#Intents 中所述。但它失败并出现权限错误:

java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/VID_20160511_142806.mp4: open failed: EACCES (Permission denied)

有没有办法在没有READ_EXTERNAL_STORAGE 许可的情况下获取视频?

【问题讨论】:

  • 你实际上想要WRITE_EXTERNAL_STORAGE,而不是。它隐含包含READ_EXTERNAL_STORAGE
  • 其实我的应用只需要READ_EXTERNAL_STORAGE。相机应用需要WRITE_EXTERNAL_STORAGE,但它已经有了。
  • Can I record a video 所以,你想保存它。因此,您实际上需要WRITE_EXTERNAL_STORAGE
  • 不,我没有。只有相机应用程序需要保存它。此相机应用程序最有可能随系统一起提供并具有适当的权限。我的应用只需要读取结果。
  • 我将record 更改为capture。所以它可能更像是一个不成文的东西——比如内存中的 BLOB。

标签: android android-intent android-permissions


【解决方案1】:

我希望相机应用程序授予我临时权限

file: Uri 无法做到这一点。这只能通过content: Uri 实现。

有没有办法在没有 READ_EXTERNAL_STORAGE 权限的情况下不请求视频?

向您的应用添加FileProvider。然后,在您的ACTION_VIDEO_CAPTURE Intent 上使用EXTRA_OUTPUT,从您的FileProvider 提供一个content: Uri。在Intent 上包含适当的标志,以授予对处理您的ACTION_VIDEO_CAPTURE Intent 的任何应用程序的写访问权限。然后 - 假设相机应用程序编写良好 - 视频将写入应用程序内部存储上的文件(或您配置 FileProvider 提供服务的任何位置),您将不需要 READ_EXTERNAL_STORAGE

但请注意,如果您的 targetSdkVersion 为 23+,则至少在 Android 6.0+ 上,您确实需要 CAMERA 权限。

【讨论】:

  • 这看起来很有希望,但我无法让它在我的 Nexus5X + marshmallow 上工作。我在EXTRA_OUTPUT 中传递content://com.company.video/uploads/1463007061740,然后我从相机应用程序中得到CAM_StateReviewVid: java.io.FileNotFoundException: Can't access /uploads/1463007061740,预览为黑色。我想我现在只是坚持询问外部存储权限...无论如何感谢您的帮助。
  • @mbonnin:这需要尽快解决。 file: Uri values stop working on Android N,一旦你将targetSdkVersion 设置得足够高。
  • 该死!感谢您提供详细信息。话虽如此,我不是创建file: uri 的人,而是谷歌相机应用程序。我很高兴获得一个附加临时权限的content: uri,但现在不是这样......
  • @mbonnin:“话虽如此,我不是创建文件的人:uri,谷歌相机应用程序是”——啊,是的,我在想你把 EXTRA_OUTPUT 换成一个file:Uri
  • 我想通了。问题是我的应用程序在Application.onCreate() 上为图像创建了一个文件夹,这显然失败了,因为在第一次运行时它在启动后没有WRITE_EXTERNAL_STORAGE 权限(用户尚未确认请求)。令人沮丧的是,股票相机和/或FileProvider在将图像写入文件时出错的情况下没有向屏幕或Logcat报告任何事情。
猜你喜欢
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多