Impossibile trovare il fornitore di contenuti nell'API 30

Aug 24 2020

AGGIORNAMENTO: Devo cambiare completamente la mia domanda poiché ho trovato maggiori dettagli relativi al mio problema.

Il problema: la mia app che risolve il provider di contenuti non funziona nell'emulatore con API 30. L'errore:

java.lang.SecurityException: Failed to find provider com.a52.datafeeder01.MyProvider for user 0; expected to find a valid ContentProvider for this authority

Se utilizzo le API 26,27,28 e 29, non ci sono problemi .

AndroidManifest.xml nell'app con 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 nell'app client:

<manifest>
...
    <uses-permission android:name="MyProvider._READ_PERMISSION" />
...
</manifest>

Se provo a risolvere Content Provider nella stessa app, funziona.

Se utilizzo packageManager.getInstalledPackages(PackageManager.GET_PROVIDERS)nel mio codice client per ottenere l'elenco dei provider esistenti, per le API [26,29] posso vedere il mio provider nell'elenco. Se eseguo questo codice nell'API 30 il mio provider non è nell'elenco.

Sembra che qualcosa sia stato cambiato nell'API 30 relativo alla registrazione di ContentProvider. Tuttavia non riesco a trovare cosa.

Risposte

3 StahlRat Sep 28 2020 at 20:13

Il motivo per cui il mio ContentProvider personalizzato non funziona su Emulator con API 30 è la visibilità del pacchetto in Android 11+

Per risolvere il mio problema, ho aggiunto il seguente <queries>elemento nel file AndroidManifest.xml del client:

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

dove com.a52.datafeeder01è il nome del pacchetto in cui è definito ContentProvider personalizzato.

Isato Dec 02 2020 at 16:44

In caso di mio problema, aggiungi semplicemente:

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

dove il authoritiesvalore è le autorità del fornitore.

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