android 在API 30中找不到内容提供方

pbossiut  于 2022-12-09  发布在  Android
关注(0)|答案(4)|浏览(254)

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

问题在于:解析内容提供者的应用程序无法在具有API 30的Emulator中运作。错误:

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与内容提供程序:

<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注册相关的内容发生了变化。但是我找不到是什么。

slmsl1lt

slmsl1lt1#

我的自定义ContentProvider无法在使用API 30的Emulator上工作的原因是Package visibility in Android 11+

为了修复我的问题,我在客户端的AndroidManifest.xml中添加了以下<queries>元素:

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

其中com.a52.datafeeder01是定义自订ContentProvider的套件名称。

xwbd5t1u

xwbd5t1u2#

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

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

其中authorities值是提供程序权限。
参考:https://developer.android.com/training/basics/intents/package-visibility#provider-authority

gojuced7

gojuced73#

请在清单中添加以下权限

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

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

vzgqcmou

vzgqcmou4#

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

相关问题