【问题标题】:ChooserTargetService and content provider permissionsChooserTargetService 和内容提供者权限
【发布时间】:2016-06-16 13:34:36
【问题描述】:

我们已经在我们的应用中实现了 Android M 的 Direct Share 支持,但是当我们尝试在我们的 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)

【问题讨论】:

标签: android


【解决方案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,而不必担心其他应用程序会访问您的数据,只要您还为您的提供商1 设置了permission(或readPermission 或writePermission)。

当然,困难在于知道如何授予您的ChooserTargetService 权限,因为您无法控制它在 Android 系统的活页夹线程上运行时请求的权限。

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

我唯一想知道的是什么阻止了另一个应用程序实现自己的ChooserTargetService,获得许可并使用你的ContentProvider?好吧,我检查过了,但似乎系统不允许通过SecurityException...这很好,但我仍然感到困惑!

【讨论】:

    【解决方案2】:

    因此,找到了以下解决方案....特别是:“如果线程由具有提供程序的应用程序的任何组件启动,那么您可以访问 ContentProvider 而不会出现任何 SecurityException。”

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

    【讨论】:

    • 嗨,约翰,您能否稍微扩展一下这个答案,也许是一些示例代码?我基本上与您有完全相同的问题,但我无法从您发布的链接中找到解决方案。我了解SecurityException 背后的原因,但我不知道如何授予Binder 进程访问我的ContentProvider 的权限。 TIA!
    • @aoemerson 我创建了 Thread (t),在其中我调用了 getContentResolver().query() 然后运行 ​​t.start(); t.join();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多