授予 FileProvider 的 uri 权限会产生 SecurityException
Posted
技术标签:
【中文标题】授予 FileProvider 的 uri 权限会产生 SecurityException【英文标题】:Granting uri permissions for FileProvider gives SecurityException 【发布时间】:2016-05-30 09:17:01 【问题描述】:我有 2 个应用程序 - Demo 和 Pro。 Demo 有一个 content provider,安装 Pro 后需要从 demo provider 传输所有文件。
演示应用(提供者):
<provider
android:name="***.provider.InternalStorageProvider"
android:authorities="***.demo.storage.int.provider"
android:exported="false"
android:syncable="true"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/int_storage_paths" />
</provider>
专业应用(消费者):
实验一:
ParcelFileDescriptor pfd = cr.openFileDescriptor(exposedFileUri, "r"); FileInputStream input = new FileInputStream(pfd.getFileDescriptor());
java.lang.SecurityException: Permission Denial: 打开提供者 .provider.InternalStorageProvider 来自 ProcessRecord9c85875 10734:/u0a61 (pid=10734, uid=10061) 不是从 uid 10062 导出的
实验 2:
活动活动 = getActivity(); activity.grantUriPermission(activity.getPackageName(),exposedFileUri,Intent.FLAG_GRANT_READ_URI_PERMISSION);
ParcelFileDescriptor pfd = cr.openFileDescriptor(exposedFileUri, "r"); FileInputStream input = new FileInputStream(pfd.getFileDescriptor());
java.lang.SecurityException: Uid 10061 没有 uri 的权限 0@content://***.demo.storage.int.provider/db/file1
InternalStorageProvider
是普通FileProvider
的副本。但这并不重要,因为执行甚至无法达到它。在调用它之前抛出异常。
请注意,不涉及选择器活动和意图。消费者尝试直接从已知 uri 打开文件,无需选择器。我发现的大多数示例都使用Intent.FLAG_GRANT_READ_URI_PERMISSION
,但我根本没有使用意图。
我应该如何正确地向消费者授予 uri 权限?
【问题讨论】:
现在正在处理这个问题,你有没有机会解决它? 那是很久以前的事了,我几乎什么都不记得了。这东西真的很邪恶。 通过将FLAG_GRANT_READ_URI_PERMISSION
传递给在我的应用程序中使用 URI 的所有其他意图来解决它
【参考方案1】:
您需要授予专业应用权限...
activity.grantUriPermission("pro app package name", exposedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
【讨论】:
以上是关于授予 FileProvider 的 uri 权限会产生 SecurityException的主要内容,如果未能解决你的问题,请参考以下文章
Android:java.lang.SecurityException:没有权限uri 0 @ content://com.android.chrome.FileProvider/BlockedFil
android 7.0 关闭严格模式绕过fileprovider共享文件的限制
使用 FileProvider uri 打开 PDF 文件会打开一个空白屏幕