内容提供者的应用程序如何指定客户端应用程序访问提供者数据所需的权限?

Posted

技术标签:

【中文标题】内容提供者的应用程序如何指定客户端应用程序访问提供者数据所需的权限?【英文标题】:How does Content Provider's application specify permissions that client apps need in order to access the provider's data? 【发布时间】:2015-07-17 19:22:49 【问题描述】:

背景

我正在阅读this tutorial on android Content Providers。我从本教程中了解到,

为了让其他应用程序访问内容提供者的数据,提供者应用程序必须指定客户端应用程序访问其提供者数据所需的权限。

客户端应用程序使用 <uses-permission> 元素在其清单文件中指定它们所需的权限,例如

<uses-permission android:name="android.permission.READ_USER_DICTIONARY" > <!-- In the client app's manifest -->

然后,当用户安装客户端应用程序时,APK 管理器会询问用户是否同意这些权限(在客户端应用程序中)。

问题

我的问题是,提供者(应用程序)如何指定其他客户端应用程序必须授予的权限才能访问提供者的数据?

来自developer guide,

查找提供程序的读取访问权限的确切名称 您正在使用,以及 使用的其他访问权限的名称 由提供商提供,请查看提供商的文档。

那是在提供者应用程序中指定这些权限的方式吗?在提供者的文档中?如果是这样,该文档在哪里找到?我在哪里可以找到 SearchableDictionary 提供程序的文档(用作教程中的示例),如果我在我的应用程序中编写内容提供程序,我应该在哪里提供该文档?

【问题讨论】:

【参考方案1】:

在提供者应用的 AndroidManifest.xml 中定义权限

<permission
    android:name="com.myapp.PERMISSION"/>

在提供者应用的 AndroidManifest.xml 中定义提供者

<provider
        android:name=".MyProvider"
        android:authorities="com.myapp.MyProvider.AUTHORITY"
        android:enabled="true"
        android:exported="true"
        android:multiprocess="true"
        android:readPermission="com.myapp.PERMISSION" />

客户端的 AndroidManifest.xml 应该有 uses-permission 标签

<uses-permission android:name="com.myapp.PERMISSION"/>

然后客户端可以访问提供者

Cursor cursor = getContentResolver().query(
Uri.parse("content://com.myapp.MyProvider.AUTHORITY/xxx" ),null, null, null, null);

【讨论】:

非常感谢您提供非常明确的答复。但是我仍然对我从开发人员指南中引用的关于提供者文档 的引用感到有些困惑:他们在谈论什么文档?你有什么想法吗? 但我现在很清楚,我可以查看提供程序应用程序的清单以了解权限的名称。所以谢谢你。 @Solace 我确实遇到了你的问题,你能告诉我你在这个示例 UserDictionary 的清单文件中哪里找到了吗??? 就像我被跟踪一样。我为内容提供者创建了一个应用程序(充当服务器)和另一个用于访问数据的应用程序(充当客户端)。我还创建了权限并用于清单也。但在客户端应用程序中,始终未授予权限。去链接看详情***.com/q/42022121/385138 这正是我正在寻找的解决方案。谢啦! :D【参考方案2】:

并且不要忘记在客户端(B 应用程序)中将其包含在 AndroidManifest.xml 之外...。这对我有用

<queries>
        <provider android:authorities="com.myapp.MyProvider.AUTHORITY" />
    </queries>

【讨论】:

以上是关于内容提供者的应用程序如何指定客户端应用程序访问提供者数据所需的权限?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 无法访问证书 PrivateKey“指定的提供程序类型无效”

如何在 android 内容提供程序中存储大 blob?

ContentProvider 和ContentResolver内容提供者和内容解析者

ContentProvider 和ContentResolver内容提供者和内容解析者

如何获取访问我的应用的内容提供者的应用的包名?

如何使用 Spring Security OAuth2 提供程序配置指定要保护的资源