Dichiarare le esigenze di visibilità dei pacchetti

Quando crei l'app, è importante considerare le altre app sul dispositivo con cui l'app deve interagire. Se la tua app ha come target Android 11 (livello API 30) o versioni successive, il sistema rende automaticamente visibili alcune app alla tua app, ma filtra le altre per impostazione predefinita. Questa guida descrive come rendere visibili queste altre app alla tua app.

Se la tua app ha come target Android 11 o versioni successive e deve interagire con app diverse da quelle che sono visibili automaticamente, aggiungi l'elemento <queries> nel file manifest dell'app. All'interno dell'elemento <queries>, specifica le altre app in base al nome del pacchetto, in base alla firma dell'intent o in base all'autorità del provider, come descritto nelle sezioni seguenti.

Nomi di pacchetti specifici

Se conosci le app specifiche su cui vuoi eseguire query o con cui vuoi interagire, ad esempio le app che si integrano con la tua app o le app di cui utilizzi i servizi, includi i relativi nomi dei pacchetti in un insieme di elementi <package> all'interno dell'elemento <queries>:

<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

Comunicare con un'app host in una raccolta

Se sviluppi una libreria Android, puoi dichiarare le tue esigenze di visibilità del pacchetto aggiungendo un elemento <queries> nel file manifest AAR. Questo elemento <queries> ha la stessa funzionalità dell'elemento che le app possono dichiarare nei propri manifest.

Se la libreria prevede la comunicazione con un'app host, ad esempio l'utilizzo di un servizio associato, includi un elemento <package> che specifichi il nome del pacchetto dell'app host:

<!-- Place inside the <queries> element. -->
<package android:name=PACKAGE_NAME />

Se includi questa dichiarazione, puoi verificare se l'app host è installata e interagire con questa dichiarazione, ad esempio chiamando bindService(). L'app per le chiamate che utilizza la tua raccolta diventa automaticamente visibile per l'app host a seguito di questa interazione.

Pacchetti che corrispondono a una firma di filtro per intent

La tua app potrebbe dover eseguire query o interagire con un insieme di app che hanno uno scopo specifico, ma potresti non conoscere i nomi specifici dei pacchetti da includere. In questo caso, puoi elencare le firme di filtro dell'intent nel tuo elemento <queries>. L'app può quindi rilevare le app con elementi <intent-filter> corrispondenti.

Il seguente esempio di codice mostra un elemento <intent> che consente all'app di vedere altre app installate che supportano la condivisione di immagini JPEG:

<manifest package="com.example.game">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    ...
</manifest>

L'elemento <intent> ha alcune limitazioni:

  • Devi includere un solo elemento <action>.
  • Non puoi utilizzare gli attributi path, pathPrefix, pathPattern o port in un elemento <data>. Il sistema si comporta come se impostassi il valore di ogni attributo sul carattere jolly generico (*).
  • Non puoi utilizzare l'attributo mimeGroup di un elemento <data>.
  • All'interno degli elementi <data> di un singolo elemento <intent>, puoi utilizzare ciascuno dei seguenti attributi al massimo una volta:

    • mimeType
    • scheme
    • host

    Puoi distribuire questi attributi tra più elementi <data> o utilizzarli in un singolo elemento <data>.

L'elemento <intent> supporta il carattere jolly generico (*) come valore per alcuni attributi:

  • Attributo name dell'elemento <action>.
  • Il sottotipo dell'attributo mimeType di un elemento <data> (image/*).
  • Il tipo e il sottotipo dell'attributo mimeType di un elemento <data> (*/*).
  • Attributo scheme di un elemento <data>.
  • Attributo host di un elemento <data>.

Se non diversamente specificato nell'elenco precedente, il sistema non supporta una combinazione di testo e caratteri jolly, ad esempio prefix*.

Pacchetti che utilizzano un'autorità specifica

Se devi eseguire una query su un fornitore di contenuti, ma non conosci i nomi specifici dei pacchetti, puoi dichiarare l'autorità del provider in un elemento <provider>, come mostrato nel seguente snippet:

<manifest package="com.example.suite.enterprise">
    <queries>
        <provider android:authorities="com.example.settings.files" />
    </queries>
    ...
</manifest>

Puoi dichiarare le autorità del fornitore in un singolo elemento <queries>. All'interno dell'elemento <queries>, puoi dichiarare uno o più elementi <provider>. Un elemento <provider> può includere una singola autorità del provider o un elenco delimitato da punti e virgola di autorità del provider.

Tutte le app (non consigliato)

In rari casi, la tua app potrebbe dover eseguire query o interagire con tutte le app installate su un dispositivo, indipendentemente dai componenti che contengono. Per consentire alla tua app di visualizzare tutte le altre app installate, il sistema fornisce l'autorizzazione QUERY_ALL_PACKAGES.

Ecco alcuni esempi di casi d'uso in cui conviene includere l'autorizzazione QUERY_ALL_PACKAGES:

  • App di accessibilità
  • Browser
  • App di gestione dei dispositivi
  • App di sicurezza
  • App antivirus

Tuttavia, di solito è possibile soddisfare i casi d'uso dell'app interagendo con il set di app visibili automaticamente e dichiarando le altre app a cui l'app deve accedere nel file manifest. Per rispettare la privacy degli utenti, la tua app deve richiedere la quantità minima di visibilità dei pacchetti necessaria per far funzionare l'app.

Questo aggiornamento delle norme di Google Play fornisce linee guida per le app che richiedono l'autorizzazione QUERY_ALL_PACKAGES.