在API 30中找不到内容提供程序

20

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

问题:我的解析内容提供程序的应用在 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>

如果我尝试在同一应用程序中解析内容提供程序,它可以正常工作。

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

似乎API 30中有关ContentProvider注册的某些内容已更改,但我找不到哪里发生了变化。


@blackapps,我已经更新了提供程序定义,包括最新的更改。 - StahlRat
难道不是缺少了一个重要的URI权限吗? - blackapps
@blackapps,我已经尝试了URI权限,但没有任何区别。在设备上仍然可以正常工作,在模拟器上却不行。 - StahlRat
app-2如何知道app-1的内容提供者? - blackapps
抱歉回复晚了。为了快速解决问题,我尝试将API级别降级至29级。 - Arif Hidayat
显示剩余4条评论
4个回答

40

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

为了解决这个问题,我已经在客户端的AndroidManifest.xml文件中添加了以下<queries>元素:

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

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


1
+1 花费了很多时间疑惑为什么我的内容提供程序在真机上可以工作但在模拟器上却不能。最终发现,模拟器是基于 API 30 的,这个包的可见性导致了问题。这是正确的解决方案,但我必须用 provider 标签替换掉包。 - mallaudin

12

这个解决方案对我没用,唯一有效的解决方案是在包标签内提供包名,像这样:<queries> <package android:name="com.a52.datafeeder01" /> </queries> 有人能告诉我这两种方法的区别吗? - Ahmad Ayyaz

7
请在清单文件中添加以下权限。
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
                     tools:ignore="QueryAllPackagesPermission"/>

这解决了我的安卓11问题。

非常感谢,这个工作得很好。<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission"/> - Shyam Sunder
Google Play限制使用高风险或敏感权限,包括QUERY_ALL_PACKAGES权限,该权限可以查看给定设备上安装的应用程序清单。有关更多详细信息,请阅读此文章: https://support.google.com/googleplay/android-developer/answer/10158779?hl=en - Ahmad Ayyaz

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接