API30でコンテンツプロバイダーが見つかりませんでした
更新:問題に関連する詳細を見つけたので、質問を完全に変更する必要があります。
問題:コンテンツプロバイダーを解決する私のアプリは、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]の場合、リストにプロバイダーが表示されます。このコードをAPI30で実行すると、プロバイダーがリストに含まれません。
ContentProviderの登録に関連してAPI30で何かが変更されたようです。しかし、私は何を見つけることができません。
回答
カスタムContentProviderがAPI30のエミュレーターで機能しない理由は、Android11以降でのパッケージの可視性です
問題を修正するために、<queries>
クライアントのAndroidManifest.xmlに次の要素を追加しました。
<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