无法在API 30中找到Content Provider

问题描述

更新:由于我发现了与我的问题有关的更多详细信息,因此我必须完全更改我的问题。

问题:我的可解析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,那么没问题

带有ContentProvider的应用中的AndroidManifest.xml:

<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>

如果我尝试在同一应用程序中解析Content Provider,则可以使用。

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

似乎API 30中的某些内容与ContentProvider的注册有关。但是我找不到。

解决方法

我的自定义ContentProvider无法在API 30的模拟器上运行的原因是Package visibility in Android 11+

要解决,我已在客户端的AndroidManifest.xml中添加了以下<queries>元素:

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

其中com.a52.datafeeder01是定义自定义ContentProvider的程序包名称。

,

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

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

其中authorities的值是提供者的权限。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...