问题描述
更新:由于我发现了与我的问题有关的更多详细信息,因此我必须完全更改我的问题。
问题:我的可解析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