Questo documento presenta diversi casi d'uso comuni in cui un'app interagisce con altre app. Ogni sezione fornisce indicazioni su come implementare le funzionalità dell'app con una visibilità limitata dei pacchetti, che devi tenere in considerazione se la tua app è destinata ad Android 11 (livello API 30) o versioni successive.
Quando un'app destinata ad Android 11 o versioni successive utilizza un intent per
avviare un'attività in un'altra app, l'approccio più semplice è richiamare
l'intent e gestire l'
ActivityNotFoundException
eccezione se non è disponibile alcuna app.
Se una parte della tua app dipende dal fatto che la chiamata a
startActivity()
possa avere esito positivo, ad esempio la visualizzazione di un'interfaccia utente, aggiungi un elemento all'elemento
<queries> del file manifest dell'app. In genere, si tratta di un elemento <intent>.
Aprire gli URL
Questa sezione descrive vari modi per aprire gli URL in un'app destinata ad Android 11 o versioni successive.
Aprire gli URL in un browser o in un'altra app
Per aprire un URL, utilizza un intent che contenga l'azione dell'intent
ACTION_VIEW, come
descritto nella guida al caricamento di un URL
web. Dopo aver chiamato startActivity()
utilizzando questo intent, si verifica una delle seguenti situazioni:
- L'URL si apre in un'app browser web.
- L'URL si apre in un'app che supporta l'URL come link diretto.
- Viene visualizzata una finestra di dialogo di disambiguazione che consente all'utente di scegliere l'app che apre l'URL.
Si verifica un'eccezione
ActivityNotFoundExceptionperché sul dispositivo non è installata un'app in grado di aprire l'URL. (È un caso raro.)Ti consigliamo di fare in modo che la tua app rilevi e gestisca l'
ActivityNotFoundExceptionse si verifica.
Poiché il metodo startActivity() non richiede la visibilità del pacchetto per
avviare l'attività di un'altra applicazione, non devi aggiungere un elemento <queries>
al file manifest dell'app né apportare modifiche a un elemento <queries>
esistente. Questo vale sia per gli intent impliciti sia per quelli espliciti che aprono un URL.
Verificare se è disponibile un browser
In alcuni casi, la tua app potrebbe voler verificare che sul dispositivo sia disponibile almeno un browser
o che un browser specifico sia il browser predefinito,
prima di tentare di aprire un URL. In questi casi, includi il seguente
<intent> elemento come parte dell'<queries> elemento nel file manifest:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" /> </intent>
Quando chiami queryIntentActivities() e passi un intent web come argomento,
l'elenco restituito include le app browser disponibili in alcuni casi. L'elenco
non include le app browser se l'utente ha configurato l'URL in modo che si apra in un'
app non browser per impostazione predefinita.
Aprire gli URL nelle schede personalizzate
Le schede personalizzate consentono a un'
app di personalizzare l'aspetto e il comportamento del browser. Puoi aprire un URL in
una scheda personalizzata
senza dover aggiungere o modificare l'elemento <queries> nel file manifest dell'app.
Tuttavia, potresti voler verificare se il dispositivo ha un browser che supporta
le schede personalizzate
o selezionare un browser specifico da avviare con le schede personalizzate utilizzando
CustomTabsClient.getPackageName().
In questi casi, includi il seguente <intent> elemento come parte dell'
<queries> elemento nel file manifest:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.support.customtabs.action.CustomTabsService" /> </intent>
Consentire alle app non browser di gestire gli URL
Anche se la tua app può aprire gli URL utilizzando le schede personalizzate, ti consigliamo di consentire a un'app non browser di aprire un URL, se possibile. Per fornire questa
funzionalità nella tua app, tenta una chiamata a startActivity() utilizzando un intent
che imposta il
FLAG_ACTIVITY_REQUIRE_NON_BROWSER
flag dell'intent. Se il sistema genera un'eccezione ActivityNotFoundException, la tua app può
quindi aprire l'URL in una scheda personalizzata.
Se un intent include questo flag, una chiamata a startActivity() causa la generazione di un'eccezione
ActivityNotFoundException quando si verifica una delle seguenti
condizioni:
- La chiamata avrebbe avviato direttamente un'app browser.
- La chiamata avrebbe mostrato all'utente una finestra di dialogo di disambiguazione in cui le uniche opzioni sono le app browser.
Il seguente snippet di codice mostra come aggiornare la logica per utilizzare il
FLAG_ACTIVITY_REQUIRE_NON_BROWSER flag dell'intent:
Kotlin
try { val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply { // The URL should either launch directly in a non-browser app (if it's // the default) or in the disambiguation dialog. addCategory(CATEGORY_BROWSABLE) flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER } startActivity(intent) } catch (e: ActivityNotFoundException) { // Only browser apps are available, or a browser is the default. // So you can open the URL directly in your app, for example in a // Custom Tab. openInCustomTabs(url) }
Java
try { Intent intent = new Intent(ACTION_VIEW, Uri.parse(url)); // The URL should either launch directly in a non-browser app (if it's the // default) or in the disambiguation dialog. intent.addCategory(CATEGORY_BROWSABLE); intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER); startActivity(intent); } catch (ActivityNotFoundException e) { // Only browser apps are available, or a browser is the default. // So you can open the URL directly in your app, for example in a // Custom Tab. openInCustomTabs(url); }
Evitare una finestra di dialogo di disambiguazione
Se vuoi evitare di mostrare la finestra di dialogo di disambiguazione che gli utenti potrebbero visualizzare quando
aprono un URL e preferisci gestire l'URL autonomamente in queste
situazioni, puoi utilizzare un intent che imposta il
FLAG_ACTIVITY_REQUIRE_DEFAULT
flag dell'intent.
Se un intent include questo flag, una chiamata a startActivity() causa la generazione di un'eccezione
ActivityNotFoundException quando la chiamata avrebbe mostrato all'utente una finestra di dialogo di disambiguazione.
Se un intent include sia questo flag sia il
FLAG_ACTIVITY_REQUIRE_NON_BROWSER
flag dell'intent, una chiamata a startActivity() causa la generazione di un'ActivityNotFoundException
quando si verifica una delle seguenti condizioni:
- La chiamata avrebbe avviato direttamente l'app browser.
- La chiamata avrebbe mostrato all'utente una finestra di dialogo di disambiguazione.
Il seguente snippet di codice mostra come utilizzare insieme i flag FLAG_ACTIVITY_REQUIRE_NON_BROWSER
e FLAG_ACTIVITY_REQUIRE_DEFAULT:
Kotlin
val url = URL_TO_LOAD try { // For this intent to be invoked, the system must directly launch a // non-browser app. val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply { addCategory(CATEGORY_BROWSABLE) flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER or FLAG_ACTIVITY_REQUIRE_DEFAULT } startActivity(intent) } catch (e: ActivityNotFoundException) { // This code executes in one of the following cases: // 1. Only browser apps can handle the intent. // 2. The user has set a browser app as the default app. // 3. The user hasn't set any app as the default for handling this URL. openInCustomTabs(url) }
Java
String url = URL_TO_LOAD; try { // For this intent to be invoked, the system must directly launch a // non-browser app. Intent intent = new Intent(ACTION_VIEW, Uri.parse(url)); intent.addCategory(CATEGORY_BROWSABLE); intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER | FLAG_ACTIVITY_REQUIRE_DEFAULT); startActivity(intent); } catch (ActivityNotFoundException e) { // This code executes in one of the following cases: // 1. Only browser apps can handle the intent. // 2. The user has set a browser app as the default app. // 3. The user hasn't set any app as the default for handling this URL. openInCustomTabs(url); }
Aprire un file
Se la tua app gestisce file o allegati, ad esempio controllando se un dispositivo può
aprire un determinato file, in genere è più semplice provare ad avviare un'attività in grado di
gestire il file. Per farlo, utilizza un intent che includa l'azione dell'intent ACTION_VIEW
e l'URI che rappresenta il file specifico. Se sul dispositivo non è disponibile alcuna app, la tua app può rilevare l'eccezione ActivityNotFoundException. Nella logica di gestione delle eccezioni, puoi mostrare un errore o provare a gestire il file
autonomamente.
Se la tua app deve sapere in anticipo se un'altra app può aprire un determinato file,
includi l'elemento <intent> nel seguente snippet di codice come parte dell'
<queries> nel file manifest. Includi il tipo di file se lo conosci già
in fase di compilazione.
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.VIEW" /> <!-- If you don't know the MIME type in advance, set "mimeType" to "*/*". --> <data android:mimeType="application/pdf" /> </intent>
Puoi quindi verificare se è disponibile un'app chiamando resolveActivity()
con il tuo intent.
Concedere l'accesso all'URI
Nota: la dichiarazione delle autorizzazioni di accesso all'URI come descritto in questa sezione è obbligatoria per le app destinate ad Android 11 (livello API 30) o versioni successive e consigliata per tutte le app, indipendentemente dalla versione dell'SDK di destinazione e dal fatto che esportino o meno i relativi content provider.
Affinché le app destinate ad Android 11 o versioni successive possano
accedere all'URI dei contenuti, l'intent dell'app deve dichiarare le autorizzazioni di accesso all'URI
impostando uno o entrambi i seguenti flag dell'intent:
FLAG_GRANT_READ_URI_PERMISSION
e
FLAG_GRANT_WRITE_URI_PERMISSION.
Su Android 11 e versioni successive, le autorizzazioni di accesso all'URI offrono le seguenti funzionalità all'app che riceve l'intent:
- Leggere o scrivere i dati rappresentati dall'URI dei contenuti, a seconda di le autorizzazioni URI specificate.
- Ottenere visibilità sull'app contenente il content provider che corrisponde all' autorità URI. L'app che contiene il content provider potrebbe essere diversa dall'app che invia l'intent.
Il seguente snippet di codice mostra come aggiungere un flag dell'intent delle autorizzazioni URI in modo che un'altra app destinata ad Android 11 o versioni successive possa visualizzare i dati nell'URI dei contenuti:
Kotlin
val shareIntent = Intent(Intent.ACTION_VIEW).apply { flags = Intent.FLAG_GRANT_READ_URI_PERMISSION data = CONTENT_URI_TO_SHARE_WITH_OTHER_APP }
Java
Intent shareIntent = new Intent(Intent.ACTION_VIEW); shareIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION); shareIntent.setData(CONTENT_URI_TO_SHARE_WITH_OTHER_APP);
Connettersi ai servizi
Se la tua app deve interagire con un servizio che non è visibile
automaticamente, puoi dichiarare l'
azione dell'intent appropriata all'interno di un elemento <queries>. Le sezioni seguenti
forniscono esempi che utilizzano servizi a cui si accede di frequente.
Connettersi a un motore di sintesi vocale
Se la tua app interagisce con un motore di sintesi vocale, includi il seguente
<intent> elemento come parte dell'elemento <queries> nel file manifest:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.TTS_SERVICE" /> </intent>
Connettersi a un servizio di riconoscimento vocale
Se la tua app interagisce con un servizio di riconoscimento vocale, includi il seguente
<intent> elemento come parte del <queries> elemento nel file manifest:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.speech.RecognitionService" /> </intent>
Connettersi ai servizi di media browser
Se la tua app è un'app client di media browser, includi
il seguente elemento <intent> come parte dell'elemento <queries> nel file manifest:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.media.browse.MediaBrowserService" /> </intent>
Fornire funzionalità personalizzate
Se la tua app deve eseguire azioni personalizzabili o mostrare informazioni personalizzabili
in base alle interazioni con altre app, puoi rappresentare questo
comportamento personalizzato utilizzando le firme
dei filtri degli intent come
parte dell'elemento <queries> nel file manifest. Le sezioni seguenti forniscono
indicazioni dettagliate per diversi scenari comuni.
Eseguire query per le app per SMS
Se la tua app ha bisogno di informazioni sull'insieme di app per SMS installate su un
dispositivo, ad esempio per verificare quale app è il gestore di SMS predefinito del dispositivo,
includi il seguente <intent> elemento come parte dell'<queries> elemento nel
file manifest:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.SENDTO"/> <data android:scheme="smsto" android:host="*" /> </intent>
Creare un foglio di condivisione personalizzato
Se possibile, utilizza un foglio di condivisione
fornito dal sistema. In alternativa,
includi il seguente elemento <intent> come parte dell'elemento <queries> nel
file manifest:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.SEND" /> <!-- Replace with the MIME type that your app works with, if needed. --> <data android:mimeType="image/jpeg" /> </intent>
La procedura di creazione del foglio di condivisione nella logica dell'app, ad esempio la chiamata a
queryIntentActivities(), rimane invariata rispetto alle
versioni di Android precedenti ad Android 11.
Mostrare azioni di selezione del testo personalizzate
Quando gli utenti selezionano il testo nella tua app, una barra degli strumenti
di selezione del testo
mostra l'insieme delle possibili operazioni da eseguire sul testo selezionato. Se questa
barra degli strumenti mostra azioni personalizzate di altre app, includi il seguente
<intent> elemento come parte dell'<queries> elemento nel file manifest:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.PROCESS_TEXT" /> <data android:mimeType="text/plain" /> </intent>
Mostrare righe di dati personalizzate per un contatto
Le app possono aggiungere righe di dati personalizzate al Contacts Provider. Affinché un'app Contatti mostri questi dati personalizzati, deve essere in grado di eseguire le seguenti operazioni:
- Leggere il
contacts.xmlfile dalle altre app. - Caricare un'icona corrispondente al tipo MIME personalizzato.
Se la tua app è un'app Contatti, includi i seguenti <intent> elementi come parte
dell'elemento <queries> nel file manifest:
<!-- Place inside the <queries> element. --> <!-- Lets the app read the contacts.xml file from other apps. --> <intent> <action android:name="android.accounts.AccountAuthenticator" /> </intent> <!-- Lets the app load an icon corresponding to the custom MIME type. --> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="content" android:host="com.android.contacts" android:mimeType="vnd.android.cursor.item/*" /> </intent>