未能在 API 30 中找到内容提供商
Failed to find Content Provider in API 30
更新:我必须完全改变我的问题,因为我发现了更多与我的问题相关的细节。
问题:我的解析内容提供程序的应用程序无法在模拟器中使用 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
如果我使用 APIs 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>
如果我尝试在同一个应用中解析 Content Provider,它会起作用。
如果我在我的客户端代码中使用 packageManager.getInstalledPackages(PackageManager.GET_PROVIDERS)
来获取现有提供商的列表,那么 APIs [26,29] 我可以在列表中看到我的提供商。如果我 运行 API 30 中的此代码,我的提供商不在列表中。
似乎在 API30 中更改了一些与 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
请在清单中添加以下权限
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission"/>
这解决了我在 android 11
中遇到的问题
更新:我必须完全改变我的问题,因为我发现了更多与我的问题相关的细节。
问题:我的解析内容提供程序的应用程序无法在模拟器中使用 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
如果我使用 APIs 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>
如果我尝试在同一个应用中解析 Content Provider,它会起作用。
如果我在我的客户端代码中使用 packageManager.getInstalledPackages(PackageManager.GET_PROVIDERS)
来获取现有提供商的列表,那么 APIs [26,29] 我可以在列表中看到我的提供商。如果我 运行 API 30 中的此代码,我的提供商不在列表中。
似乎在 API30 中更改了一些与 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
请在清单中添加以下权限
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission"/>
这解决了我在 android 11
中遇到的问题