23

我的应用程序允许用户从其他应用程序导入他们的照片和视频。现在谷歌用谷歌照片取代了谷歌+照片,我遇到了一些事情。其中之一是在应用重新启动后重新使用导入的文件。我有一种感觉,当 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

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

4

6 回答 6

27

是的,这是设计使然,如Android 开发者网站所述。

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

于 2015-07-07T16:43:48.020 回答
13
  1. 当您使用“Google 照片”应用程序时,您可以重现此 SecurityException 日志。

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

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

所以,我建议你在Activity A上临时保存文件,在Activity B上使用临时文件路径

于 2015-06-18T07:30:03.227 回答
3

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

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
于 2015-06-02T20:17:20.807 回答
2

看起来这个问题很相似

我认为当活动(而不是片段)死亡时 - 它检索到的所有 URI 都变得无效

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

于 2015-06-03T22:46:52.253 回答
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);
        }
于 2017-01-12T18:48:32.437 回答
0

我对此有同样的问题,您可以尝试以下解决方法:

  1. 如果从图库中选择图像,Android 5.1.1 lollipop 返回空文件路径

  2. https://gist.github.com/alexzaitsev/75c9b36dfcffd545c676

  3. 使用新的 Google 相册应用选择照片已损坏

于 2015-06-09T15:59:27.237 回答