使用来自上下文提供商的数据或请求Google照片读取权限?

vki*_*ins 21 android android-contentprovider google-photos

我的应用允许用户从其他应用导入他们的照片和视频.现在谷歌用Google照片取代了Google+照片,但有些事情让我感到震惊.其中一件事是在应用重启后重新使用导入的文件.我感觉他们已经收紧了Google照片使用图片URI返回意图时发出的权限,因此在我的应用程序被杀后,它不再拥有访问上传文件的权限.我正在接受安检:

java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.MediaContentProvider from ProcessRecord{2c17ab9e 2124:com.myapp.myapp/u0a436} (pid=2124, uid=10436) that is not exported from uid 10427
Run Code Online (Sandbox Code Playgroud)

编辑:

我也在重复使用提供的文件时遇到同样的问题 com.google.android.apps.docs.sync.filemanager.FileProvider

有什么建议/解决方法吗?我知道我可以在失去许可之前阅读该文件,所以理论上我可以复制它,但我不能说我非常喜欢这个...

Daz*_*bao 20

是的,这是设计,如Android开发者网站上所述.

出于安全原因,权限是临时的,因此一旦客户端应用程序的任务堆栈完成,该文件就不再可访问.在onActivityResult方法中,您必须在收到意图答案时获取文件数据.存储文件数据的副本,因为当onActivityResult返回时,该文件将不再可用.

  • 我有一个类似的问题,我能够通过使用 ACTION_OPEN_DOCUMENT 而不是 ACTION_PICK 来修复它。我相信 ACTION_OPEN_DOCUMENT 授予持久权限,并且不像 ACTION_PICK 那样严格。当我使用 ACTION_PICK 时,当我在一个活动中获得 URI 并转到另一个活动以显示图像时,我失去了许可,正如开发人员文档所说。 (3认同)

Blu*_*ist 9

  1. 您可以在使用"Google Photo"应用时重现此SecurityException日志.

  2. 导致此问题的主要原因是"Google Photo"将ContentUri与"content://com.google.android.apps.photos.contentprovider/1/1"等固定字符串共享,并将其与静态临时值相关联.当接收到Intent.ACTION_SEND的实际Activity或Context时,"Google Photo"不提供文件路径.也许,它是"Google Photo"的政策,不是将私有图像文件暴露给其他应用程序.

  3. 例如,您在Manifest文件中定义了2个Activity,Actvity A和Activity B. Activity A用于接收Intent.ACTION_SEND.活动B用于处理图像文件.活动A转发活动B的意图.然后活动B不是"Google Photo"的正确活动,您遇到SecurityException.

因此,我建议您临时将文件保存在活动A上,并使用活动B上的临时文件路径