我有一个应用程序,在Android清单文件中包含一个导出的ContentProvider。
<provider
android:authorities="my.content.Provider"
android:name="my.content.Provider"
android:exported="true"
tools:ignore="ExportedContentProvider"/>此提供程序的实现如下:
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
}我可以向亚行查询这个提供者:
$ adb shell content query --uri content://my.content.Provider
Row: 0 _id=1, data=data from the provider然而,当我在Android11上运行时,我无法从另一个应用程序中查询它。我试图跟踪内容提供者的安卓开发人员文档,但没有成功。在我的另一个应用程序的主要活动中,我试图查询内容提供者的代码:
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。
发布于 2021-06-13 14:21:13
虽然大多数关于包可见性规则的讨论都围绕着活动进行,但是绑定到服务以及与内容提供者交互显然也需要它。
发布于 2021-06-13 15:06:52
为了对CommonsWare接受的答案做一些扩展,观察到的问题是由于Android 11中的包可见性博客文章中描述的Android11引入了新的隐私保护功能。
当在Android11或更高版本上定位和运行时,需要将元素添加到应用程序的清单中,这些应用程序希望以各种方式与其他应用程序交互,包括使用内容提供商。包可见性文档表示Google可以分析清单文件以及<queries>元素和QUERY_ALL_PACKAGES权限的使用,以检测可能以不符合策略的方式访问个人和敏感用户数据的应用程序。
此外,过滤包的可见性还可以帮助像Google这样的应用商店评估应用程序为用户提供的隐私和安全性。例如,Google认为安装的应用程序列表是个人的、敏感的用户数据。
因此,如果在Android11上的另一个应用程序中使用内容提供程序,希望访问内容提供者数据的内容解析器应用程序需要使用<queries>元素更新清单文件。它应该包含一个<provider>子程序,它指定它要查询的内容提供者的权限:
<queries>
<provider android:authorities="my.content.Provider" />
</queries>https://stackoverflow.com/questions/67958030
复制相似问题