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

时间:2015-06-01 11:24:13

标签: 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

编辑:

重复使用com.google.android.apps.docs.sync.filemanager.FileProvider

提供的文件时,我也遇到了同样的问题

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

6 个答案:

答案 0 :(得分:20)

是的,这是设计的,如Android Developer site所述。

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

答案 1 :(得分:9)

  1. 使用“Google Photo”应用时,您可以重现此SecurityException日志。

  2. 此问题的主要原因是“Google Photo”使用固定字符串(例如“content://com.google.android.apps.photos.contentprovider/1/1”)共享ContentUri并将其与静态临时字符连接值。当接收到Intent.ACTION_SEND的实际Activity或Context时,“Google Photo”不提供文件路径。也许,这是“Google Photo”的政策,不是将私有图片文件暴露给其他应用。

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

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

答案 2 :(得分:2)

也许您可以尝试将此用户权限添加到清单文件中。

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

答案 3 :(得分:1)

您需要明确将权限设置为符合您意图的所有包。 它通常发生在Android 4.4中。

您可以使用此实用程序执行此操作:

List<ResolveInfo> resInfoList = getContext().getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resInfoList) {
            String packageName = resolveInfo.activityInfo.packageName;
            getContext().grantUriPermission(packageName, imageFileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }

答案 4 :(得分:0)

看起来this问题是类似的

我认为当活动(不是片段)死亡时 - 所有由它检索到的URI都会失效

我也有同样的问题 - 尝试在后台上传图片。但UI线程中的用户可能会更改活动并且URI变为无效

答案 5 :(得分:0)