ChooserTargetService和内容提供者权限

时间:2016-06-16 13:34:37

标签: android

我们在应用中实施了Android M的直接共享支持,但在我们尝试访问ChooserTargetService实现中的内容提供程序时获得了SecurityException。我们不想为内容提供者设置“exported = true”...。似乎我们需要调用grantUriPermission()。有什么不清楚,如果这是正确的方法,是传递给它的包名称(尝试了各种不成功)。

我们得到以下例外:

W Binder  : Caught a RuntimeException from the binder stub implementation.
W Binder  : java.lang.SecurityException: Permission Denial: reading <my content provider> uri     <content provider uri> from pid=0, uid=1000 requires the provider be exported, or grantUriPermission()
W Binder  :     at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605)
W Binder  :     at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480)
W Binder  :     at android.content.ContentProvider$Transport.query(ContentProvider.java:211)
W Binder  :     at android.content.ContentResolver.query(ContentResolver.java:491)
W Binder  :     at android.content.ContentResolver.query(ContentResolver.java:434)
W Binder  :     at <my package>.MyChooserTargetService.onGetChooserTargets(MyChooserTargetService.java:66)
W Binder  :     at android.service.chooser.ChooserTargetService$IChooserTargetServiceWrapper.getChooserTargets(ChooserTargetService.java:147)
W Binder  :     at android.service.chooser.IChooserTargetService$Stub.onTransact(IChooserTargetService.java:67)
W Binder  :     at android.os.Binder.execTransact(Binder.java:453)

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题(参见my comment)并且已经找到了解决这一特定问题的方法。

<强> TL; DR

将您的提供者设置为exported=true并将以下行添加到其清单部分:

android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"

所以看起来有点像:

<provider
    android:name=".db.MyContentProvider"
    android:authorities="@string/authority"
    android:exported="true"
    android:readPermission="android.permission.BIND_CHOOSER_TARGET_SERVICE"/>

更长版本

您可以将ContentProvider设置为exported=true,而无需担心其他应用访问您的数据,只要您还有permission(或readPermission或{{1} })为您的提供商1设置。

当然,困难在于知道如何给你的writePermission许可,因为你不能控制它在android系统的活页夹线程上运行时所请求的权限。

但是,有一个权限我们知道只有android系统的Direct Share选择器才能获得:ChooserTargetService。此permission由签名保护,因此无法通过系统进程以外的任何其他方式获取。

我唯一想知道的是阻止另一个App实现自己的android.permission.BIND_CHOOSER_TARGET_SERVICE,获得许可并使用ChooserTargetService?好吧,我检查了一下,但似乎系统不允许它通过ContentProvider ...这很好,但仍然让我感到困惑!

答案 1 :(得分:0)

所以,在下面找到了解决方案......特别是:“如果一个Thread由具有提供者的应用程序的任何组件启动,那么你可以在没有任何SecurityException的情况下访问ContentProvider。”

How would a thread created by an app be considered a different app from the app's ContentProvider?