在 API 30 中找不到内容提供者

问题描述 投票:0回答:5

更新:我必须完全改变我的问题,因为我发现了与我的问题相关的更多细节。

问题:我的解决 Content Provider 的应用程序无法在 API 30 的模拟器中运行。错误:

java.lang.SecurityException: Failed to find provider com.a52.datafeeder01.MyProvider for user 0; expected to find a valid ContentProvider for this authority

如果我使用 API 26、27、28 和 29,那么没有问题

应用程序中的 AndroidManifest.xml 与 ContentProvider:

<manifest>
    <permission
        android:name="MyProvider._READ_PERMISSION"
        android:protectionLevel="normal" />
    <application>
        <activity>
        ...
        </activity>
        <provider android:name=".MyProvider"
            android:authorities="com.a52.datafeeder01.MyProvider"
            android:enabled="true"
            android:exported="true"
            android:readPermission="MyProvider._READ_PERMISSION"/>
    </application>
</manifest>

客户端应用程序中的AndroidManifest.xml:

<manifest>
...
    <uses-permission android:name="MyProvider._READ_PERMISSION" />
...
</manifest>

如果我尝试在同一应用程序中解析内容提供程序,它会起作用。

如果我在客户端代码中使用

packageManager.getInstalledPackages(PackageManager.GET_PROVIDERS)
来获取现有提供商的列表,那么对于 API [26,29],我可以在列表中看到我的提供商。如果我在 API 30 中运行此代码,我的提供商不在列表中。

API 30 中似乎对与 ContentProvider 注册相关的内容进行了更改。但我找不到什么。

android android-contentprovider android-contentresolver
5个回答
40
投票

我的自定义 ContentProvider 无法在 API 30 的模拟器上工作的原因是 Android 11+ 中的包可见性

要修复我的问题,我已将以下

<queries>
元素添加到客户端的 AndroidManifest.xml 中:

<manifest>
...
    <queries>
        <package android:name="com.a52.datafeeder01" />
    </queries>
...
</manifest>

其中

com.a52.datafeeder01
是定义自定义 ContentProvider 的包名称。


12
投票

如果我遇到问题,只需添加:

<manifest>
...
    <queries>
        <provider android:authorities="com.example.appcontainprovider" />
    </queries>
...
</manifest>

其中

authorities
值是提供商权限。

参考:https://developer.android.com/training/basics/intents/package-visibility#provider-authority


7
投票

请在清单中添加以下权限

    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
                     tools:ignore="QueryAllPackagesPermission"/>

这解决了我在 Android 11 中的问题


0
投票

从 Android 11 开始,包可见性发生了变化。所以需要添加查询如下

https://developer.android.com/training/package-visibility

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="yourPackage">
    <queries>
         <provider android:authorities="providerAuthority" />
    </queries>
    //Add your content provider's permission
    <uses-permission android:name="com.example.permission" />
    <application ...../>
 </manifest>

0
投票

建议的方法均不适用于 API 33

© www.soinside.com 2019 - 2024. All rights reserved.