首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用ContentResolver读取另一个应用程序在Android11上导出的ContentProvider中的数据?

如何使用ContentResolver读取另一个应用程序在Android11上导出的ContentProvider中的数据?
EN

Stack Overflow用户
提问于 2021-06-13 12:02:24
回答 2查看 2.5K关注 0票数 1

我有一个应用程序,在Android清单文件中包含一个导出的ContentProvider。

代码语言:javascript
运行
复制
        <provider
            android:authorities="my.content.Provider"
            android:name="my.content.Provider"
            android:exported="true"
            tools:ignore="ExportedContentProvider"/>

此提供程序的实现如下:

代码语言:javascript
运行
复制
package my.content

// imports excluded for brevity

class Provider : ContentProvider() {
    override fun query(
        uri: Uri, p: Array<out String>?, s: String?, sa: Array<out String>?, so: String?
    ): Cursor {
        return MatrixCursor(arrayOf("_id", "data")).apply {
            newRow()
                .add("_id", "1")
                .add("data", "data from the provider")
        }
    }

    override fun getType(uri: Uri) = "vnd.android.cursor.dir/vnd.my.content.Providers.data"
    override fun insert(uri: Uri, values: ContentValues?): Uri? = null
    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?) = 0
    override fun update(uri: Uri, v: ContentValues?, s: String?, sa: Array<out String>?) = 0
    override fun onCreate() = true
}

我可以向亚行查询这个提供者:

代码语言:javascript
运行
复制
$ adb shell content query --uri content://my.content.Provider
Row: 0 _id=1, data=data from the provider

然而,当我在Android11上运行时,我无法从另一个应用程序中查询它。我试图跟踪内容提供者的安卓开发人员文档,但没有成功。在我的另一个应用程序的主要活动中,我试图查询内容提供者的代码:

代码语言:javascript
运行
复制
val cursor = contentResolver.query(
    Uri.parse("content://my.content.Provider/data"),
    null,
    null,
    null,
    null
)
cursor?.apply {
    val dataIndex = getColumnIndex("data")
    while (moveToNext()) {
        println("Data retrieved: ${getString(dataIndex)}")
    }
    close()
}

当我运行这个程序时,我得到的只是用logcat:E/ActivityThread: Failed to find provider info for my.content.Provider打印的错误消息。

由于它与亚行合作,而不是与我的内容解析器应用程序合作,我认为这是内容解析器应用程序的问题,但我不知道是什么原因。如果这很重要,内容解析器和内容提供者应用程序都有min 24级和目标/编译sdk版本30。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-13 14:21:13

虽然大多数关于包可见性规则的讨论都围绕着活动进行,但是绑定到服务以及与内容提供者交互显然也需要它。

票数 1
EN

Stack Overflow用户

发布于 2021-06-13 15:06:52

为了对CommonsWare接受的答案做一些扩展,观察到的问题是由于Android 11中的包可见性博客文章中描述的Android11引入了新的隐私保护功能。

当在Android11或更高版本上定位和运行时,需要将元素添加到应用程序的清单中,这些应用程序希望以各种方式与其他应用程序交互,包括使用内容提供商。包可见性文档表示Google可以分析清单文件以及<queries>元素和QUERY_ALL_PACKAGES权限的使用,以检测可能以不符合策略的方式访问个人和敏感用户数据的应用程序。

此外,过滤包的可见性还可以帮助像Google这样的应用商店评估应用程序为用户提供的隐私和安全性。例如,Google认为安装的应用程序列表是个人的、敏感的用户数据。

因此,如果在Android11上的另一个应用程序中使用内容提供程序,希望访问内容提供者数据的内容解析器应用程序需要使用<queries>元素更新清单文件。它应该包含一个<provider>子程序,它指定它要查询的内容提供者的权限:

代码语言:javascript
运行
复制
    <queries>
        <provider android:authorities="my.content.Provider" />
    </queries>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67958030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档