Proprio come un'app può inviare dati ad altre app, può anche ricevere dati da altre app. Pensa a come gli utenti interagiscono con la tua applicazione e a quali tipi di dati vuoi ricevere da altre applicazioni. Ad esempio, un'applicazione di social network potrebbe essere interessata a ricevere contenuti di testo, come un URL web interessante, da un'altra app.
In un'app che utilizza Compose Navigation, la ricezione dei dati inviati da un'altra app è un processo in due passaggi:
Dichiara un
<intent-filter>nel manifest: devi comunque aggiungere un filtro di intent alla tua attività nel file AndroidManifest.xml. In questo modo, il sistema operativo Android sa che la tua applicazione è in grado di ricevere azioni specifiche (come ACTION_SEND) e tipi MIME (come text/plain).Definisci un navDeepLink nel grafico di Compose Navigation: anziché intercettare e analizzare manualmente l'intent all'interno dei metodi onCreate o onNewIntent della tua attività, utilizza il supporto per i link diretti di Compose Navigation. Collega un navDeepLink che corrisponda all'azione e al tipo MIME direttamente alla destinazione componibile che deve visualizzare i contenuti. NavController intercetterà automaticamente l'intent e indirizzerà l'utente direttamente a quella schermata.
I target di condivisione diretta sono deep link a un'Activity specifica all'interno dell'app. Spesso rappresentano una persona o un gruppo e vengono visualizzati nell'Android Sharesheet. Ad esempio, un'app di messaggistica può fornire un target di condivisione diretta per una persona che rimanda direttamente a una conversazione con quella persona. Per istruzioni dettagliate, consulta Fornire target di condivisione diretta.
Supportare i tipi MIME
Idealmente, un'app deve essere in grado di ricevere la più ampia gamma possibile di tipi MIME.
Ad esempio, un'app di messaggistica progettata per l'invio di testo, immagini e video supporta idealmente la ricezione di text/*, image/* e video/*. Ecco alcuni tipi MIME comuni per l'invio e la ricezione di dati semplici in Android.
| I ricevitori si registrano per | I mittenti inviano |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| Estensioni di file supportate | application/pdf |
Consulta il registro ufficiale IANA dei tipi di media MIME.
Creare target di condivisione efficaci
Quando un utente tocca un target di condivisione associato a un'attività specifica, deve essere in grado di confermare e modificare i contenuti condivisi prima di utilizzarli. Questo è particolarmente importante per i dati di testo.
Ricevere dati con un'attività
La ricezione dei dati con un'attività prevede l'aggiornamento del manifest, la gestione dei contenuti in entrata e l'assicurazione che l'utente riconosca la tua app.
Aggiornare il manifest
I filtri di intent informano il sistema su quali intent accetta un componente dell'app.
Analogamente a come hai creato un intent con un'ACTION_SEND azione nella
lezione Invio di dati semplici ad altre app, crei filtri di intent per ricevere intent con questa azione. Definisci un filtro per intent nel manifest utilizzando l'elemento <intent-filter>.
Ad esempio, se la tua app gestisce la ricezione di contenuti di testo, un manifest che include una o più immagini di qualsiasi tipo avrà un aspetto simile al seguente snippet:
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
Quando un'altra app tenta di condividere uno di questi elementi creando un intent e passandolo a startActivity(), la tua applicazione viene elencata come opzione nell'Android Sharesheet o nel risolutore di intent. Se l'utente seleziona la tua app, viene avviata l'attività corrispondente (.ui.MyActivity nell'esempio precedente). A questo punto, devi gestire i contenuti in modo appropriato all'interno del codice e dell'interfaccia utente.
Gestire i contenuti in entrata
Per gestire i contenuti forniti da un Intent, chiama
getIntent() per ottenere l'oggetto Intent. Una volta ottenuto l'oggetto, puoi esaminarne i contenuti per determinare cosa fare dopo. Se questa attività può essere avviata da altre parti del sistema (ad esempio il launcher), tienilo presente quando esamini l'intent.
Presta particolare attenzione al controllo dei dati in entrata, non sai mai cosa potrebbe inviarti un'altra applicazione. Ad esempio, potrebbe essere impostato un tipo MIME errato o l'immagine inviata potrebbe essere estremamente grande. Inoltre, ricorda di elaborare i dati binari in un thread separato anziché nel thread principale ("UI").
@Composable fun SharesheetHandler() { val context = LocalContext.current val intent = (context as? Activity)?.intent when (intent?.action) { ACTION_SEND -> { if ("text/plain" == intent.type) { handleSendText(intent) // Handle text being sent. } else if (intent.type?.startsWith("image/") == true) { handleSendImage(intent) // Handle single image being sent } } Intent.ACTION_SEND_MULTIPLE -> { if (intent.type?.startsWith("image/") == true) { handleSendMultipleImages(intent) // Handle multiple images being sent } } else -> { // Handle other intents, such as being started from the home screen } } } fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update ViewModel state to change state of text being shared } } fun handleSendImage(intent: Intent) { IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Update ViewModel state to change state of image being shared } } fun handleSendMultipleImages(intent: Intent) { IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Update ViewModel state to change state of image(s) being shared } }
L'aggiornamento dell'interfaccia utente dopo la ricezione dei dati può essere semplice come popolare un
TextField
o più
complicato, ad esempio applicare un filtro fotografico interessante a un'immagine. Quello che accade dopo dipende dalla tua app.
Condivisione dell'URL dello screenshot
Quando scatti uno screenshot, puoi condividere lo screenshot e qualsiasi URL associato.
In questo modo, l'esperienza utente è più ricca. Quando ricevi un URL, assicurati di ottenere il campo EXTRA_TEXT dall'intent, come mostrato nell'esempio seguente:
IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Handle the EXTRA_TEXT as well val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT) // Update ViewModel state to change state image being shared and the EXTRA_TEXT // if available }
Assicurarsi che gli utenti riconoscano la tua app
La tua app è rappresentata dalla sua icona e dalla sua etichetta nel foglio di condivisione di Android e nel risolutore di intent. Entrambi sono definiti nel manifest. Puoi impostare le etichette dei filtri di attività o dei filtri per intent per fornire maggiori informazioni.
A partire da Android 10 (livello API 29), Android Sharesheet utilizza solo le icone impostate nel manifest sul tag application. Android ignora le icone impostate sui tag intent-filter e activity.