Durante la creazione dell'app, è importante tenere conto delle altre app sul dispositivo con cui deve interagire. Se la tua app ha come target Android 11 (livello API 30) o versioni successive, il sistema rende automaticamente visibili alla tua app alcune app, ma esclude altre app 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 visibili automaticamente, aggiungi l'elemento <queries>
nel file manifest dell'app. All'interno dell'elemento <queries>
, specifica le altre app per
nome del pacchetto, per firma di intent
o dall'autorità del provider, come descritto nelle
sezioni seguenti.
Nomi di pacchetti specifici
Se conosci le app specifiche con cui vuoi eseguire query o interagire, ad esempio quelle integrate con la tua app o quelle 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à dei pacchetti
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 tua libreria prevede la comunicazione con un'app host, ad esempio l'utilizzo di un servizio vincolato, 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 essa, ad esempio chiamando bindService()
.
L'app chiamante che utilizza la tua libreria diventa automaticamente visibile all'app host in seguito a questa interazione.
Pacchetti che corrispondono alla firma di un filtro per intent
La tua app potrebbe dover eseguire query o interagire con un insieme di app che hanno un scopo specifico, ma potresti non conoscere i nomi dei pacchetti specifici da includere. In questo caso, puoi elencare le firme dei filtri per intent nell'elemento <queries>
. L'app può quindi scoprire le app che hanno elementi <intent-filter>
corrispondenti.
Nell'esempio di codice riportato di seguito viene mostrato un elemento <intent>
che consente all'app di visualizzare 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 esattamente un elemento
<action>
. - Non puoi utilizzare gli attributi
path
,pathPrefix
,pathPattern
oport
in un elemento<data>
. Il sistema si comporta come se avessi impostato il valore di ciascun 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 di questi attributi al massimo una volta:mimeType
scheme
host
Puoi distribuire questi attributi su più elementi
<data>
o utilizzarli in un singolo elemento<data>
.
L'elemento <intent>
supporta il carattere jolly generico (*
) come valore per alcuni attributi:
- L'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>
. - L'attributo
host
di un elemento<data>
.
Se non diversamente specificato nell'elenco precedente, il sistema non supporta un insieme di testo e caratteri jolly, ad esempio prefix*
.
Pacchetti che utilizzano un'autorità specifica
Se devi eseguire una query su un provider di contenuti, ma non conosci i nomi specifici dei pacchetti, puoi dichiarare l'autorità del provider in un elemento <provider>
, come mostrato nello snippet seguente:
<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 fornitore o un elenco di autorità del fornitore delimitato da punto e virgola.
Tutte le app (opzione non consigliata)
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 vedere tutte le altre app installate, il sistema fornisce l'autorizzazione QUERY_ALL_PACKAGES
.
Ecco alcuni esempi di casi d'uso in cui è opportuno includere l'autorizzazioneQUERY_ALL_PACKAGES
:
- App di accessibilità
- Browser
- App di gestione del dispositivo
- App di sicurezza
- App antivirus
Tuttavia, in genere è possibile soddisfare i casi d'uso della tua app interagendo con l'insieme di app visibili automaticamente e dichiarando le altre app a cui la tua app deve accedere nel file manifest. Per rispettare la privacy degli utenti, la tua app deve richiedere la visibilità dei pacchetti minima necessaria per poter funzionare.
Questo aggiornamento delle norme di Google
Play
fornisce linee guida per le app che richiedono l'autorizzazione QUERY_ALL_PACKAGES
.