Così 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 media potrebbe essere interessata a ricevere contenuti di testo, come un URL web interessante, da un'altra app.
Gli utenti di altre app inviano spesso dati alla tua app tramite la scheda di condivisione di Android o il risolutore di intent. Le app che inviano dati alla tua app devono impostare un tipo MIME per questi dati. La tua app può ricevere i dati inviati da un'altra app nei seguenti modi:
- Un
Activity
con un tagintent-filter
corrispondente nel file manifest - Scorciatoie di condivisione pubblicate dalla tua app.
I target di condivisione diretta sono link diretti a un'attività specifica all'interno della tua app. Spesso rappresentano una persona o un gruppo e vengono visualizzati nella scheda di condivisione di Android. Ad esempio, un'app di messaggistica può fornire un target di condivisione diretta per una persona che consente di accedere direttamente a una conversazione con quella persona tramite link diretti. Per istruzioni dettagliate, consulta Fornire target di condivisione diretta.
Tipi MIME supportati
Idealmente, un'app deve essere in grado di ricevere la gamma più ampia 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 destinatari si registrano per | Mittenti che inviano |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Estensioni dei file supportate | application/pdf |
Consulta il registry ufficiale IANA dei tipi di contenuti multimediali MIME.
Scegliere 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. Ciò è particolarmente importante per i dati di testo.
Ricevere dati con un'attività
La ricezione dei dati con un'attività comporta l'aggiornamento del manifest, la gestione dei contenuti in entrata e l'assicurazione che l'utente riconosca la tua app.
Aggiorna il manifest
I filtri di intent comunicano al sistema quali intent vengono accettati da un componente dell'app.
In modo simile a come hai creato un'intenzione con un'azione ACTION_SEND
nella
lezione
Invio di dati semplici ad altre app, crei filtri di intent per ricevere intent con questa azione. Puoi
definire un filtro per intent nel file 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à il seguente aspetto:
<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 una di queste informazioni creando un intento e passandolo a startActivity()
, la tua applicazione viene elencata come opzione nella scheda Condivisione di Android o nello strumento di risoluzione degli intent. Se l'utente selezione la tua app, viene avviata l'attività corrispondente (.ui.MyActivity
nell'esempio precedente). Sarà quindi compito tuo gestire i contenuti in modo appropriato nel codice e nell'interfaccia utente.
Gestire i contenuti in entrata
Per gestire i contenuti pubblicati da un Intent
, chiama
getIntent()
per ottenere l'oggetto Intent
. Una volta ottenuto l'oggetto,
puoi esaminarne i contenuti per determinare la procedura da seguire. Se questa attività può essere avviata da altre parti del sistema (ad esempio dal programma di avvio), prendilo in considerazione quando esamini l'intent.
Fai molta attenzione a controllare i dati in entrata, non sai mai cosa potrebbe inviarti un'altra applicazione. Ad esempio, potrebbe essere impostato il tipo MIME errato o l'immagine inviata potrebbe essere estremamente grande. Inoltre, ricordati di elaborare i dati binari in un thread separato anziché nel thread principale ("UI").
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... when { intent?.action == Intent.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 == Intent.ACTION_SEND_MULTIPLE && intent.type?.startsWith("image/") == true -> { handleSendMultipleImages(intent) // Handle multiple images being sent } else -> { // Handle other intents, such as being started from the home screen } } ... } private fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update UI to reflect text being shared } } private fun handleSendImage(intent: Intent) { (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let { // Update UI to reflect image being shared } } private fun handleSendMultipleImages(intent: Intent) { intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let { // Update UI to reflect multiple images being shared } }
Java
void onCreate (Bundle savedInstanceState) { ... // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // Handle text being sent } else if (type.startsWith("image/")) { handleSendImage(intent); // Handle single image being sent } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // Handle multiple images being sent } } else { // Handle other intents, such as being started from the home screen } ... } void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared } } void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Update UI to reflect image being shared } } void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // Update UI to reflect multiple images being shared } }
L'aggiornamento dell'interfaccia utente dopo la ricezione dei dati può essere semplice come compilare un
EditText
oppure più complicato, ad esempio applicare un filtro fotografico interessante a un'immagine. È compito della tua app decidere cosa succederà dopo.
Assicurati che gli utenti riconoscano la tua app
La tua app è rappresentata dalla sua icona e dalla sua etichetta nella scheda di condivisione e nello smistamento degli intent di Android. Entrambi sono definiti nel manifest. Puoi impostare le etichette dei filtri attività o intent per fornire più contesto.
A partire da Android 10 (livello API 29), la scheda di condivisione di Android utilizza solo le icone impostate nel manifest sul tag application
. Android ignora le icone impostate sui tag intent-filter
e activity
.