API30でコンテンツプロバイダーが見つかりませんでした

Aug 24 2020

更新:問題に関連する詳細を見つけたので、質問を完全に変更する必要があります。

問題:コンテンツプロバイダーを解決する私のアプリは、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で何かが変更されたようです。しかし、私は何を見つけることができません。

回答

3 StahlRat Sep 28 2020 at 20:13

カスタムContentProviderがAPI30のエミュレーターで機能しない理由は、Android11以降でのパッケージの可視性です

問題を修正するために<queries>クライアントのAndroidManifest.xmlに次の要素を追加しました。

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

ここcom.a52.datafeeder01で、はカスタムContentProviderが定義されているパッケージ名です。

Isato Dec 02 2020 at 16:44

私の問題の場合は、単に追加してください:

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

ここで、authorities値はプロバイダー機関です。

参照: https://developer.android.com/training/basics/intents/package-visibility#provider-authority