我的应用允许用户从其他应用导入他们的照片和视频。现在谷歌用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
有任何建议/解决方法吗?我知道我可以在失去许可之前阅读该文件,所以理论上我可以复制它,但我不能说我非常喜欢这个...
答案 0 :(得分:20)
是的,这是设计的,如Android Developer site所述。
出于安全原因,权限是临时的,因此一旦客户端应用程序的任务堆栈完成,该文件就不再可访问。在onActivityResult方法中,您必须在收到意图答案时获取文件数据。存储文件数据的副本,因为当onActivityResult返回时,该文件将不再可用。
答案 1 :(得分:9)
使用“Google Photo”应用时,您可以重现此SecurityException日志。
此问题的主要原因是“Google Photo”使用固定字符串(例如“content://com.google.android.apps.photos.contentprovider/1/1”)共享ContentUri并将其与静态临时字符连接值。当接收到Intent.ACTION_SEND的实际Activity或Context时,“Google Photo”不提供文件路径。也许,这是“Google Photo”的政策,不是将私有图片文件暴露给其他应用。
例如,您在清单文件,活动A和活动B中定义了2个活动。活动A用于接收Intent.ACTION_SEND。活动B用于处理图像文件。活动A向活动B转发意图。然后活动B不是“Google Photo”的正确活动,您遇到SecurityException。
因此,我建议您暂时将文件保存在活动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)
答案 5 :(得分:0)