Ricevi dati semplici da altre app

Proprio come un'app può inviare dati ad altre app, può anche riceverli 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 networking 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:

  1. Dichiara un <intent-filter> nel manifest: devi comunque aggiungere un filtro per intent alla tua attività nel file AndroidManifest.xml. In questo modo, il sistema operativo Android comunica che la tua applicazione è in grado di ricevere azioni specifiche (come ACTION_SEND) e tipi MIME (come text/plain).

  2. Definisci un navDeepLink nel grafico di navigazione di Compose: anziché intercettare e analizzare manualmente l'intent all'interno dei metodi onCreate o onNewIntent dell'attività, utilizza il supporto dei deep link di Compose Navigation. Allega un navDeepLink che corrisponda all'azione e al tipo MIME direttamente alla destinazione composable che deve visualizzare i contenuti. NavController intercetterà automaticamente l'intent e indirizzerà l'utente direttamente a quella schermata.

Le destinazioni di Condivisione diretta sono deep link a un'Activity specifica all'interno dell'app. Spesso rappresentano una persona o un gruppo e vengono visualizzate nell'Android Sharesheet. Ad esempio, un'app di messaggistica può fornire una destinazione di condivisione diretta per una persona che collega direttamente a una conversazione con quella persona. Per istruzioni dettagliate, consulta Fornire destinazioni di condivisione diretta.

Tipi MIME supportati

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 destinatari si registrano per Invio mittenti
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Estensioni dei file supportate application/pdf

Fai riferimento al registro ufficiale dei tipi di media MIME dell'IANA.

Creare target di condivisione efficaci

Quando un utente tocca una destinazione di condivisione associata a un'attività specifica, deve poter confermare e modificare i contenuti condivisi prima di utilizzarli. Ciò è particolarmente importante per i dati di testo.

Ricevere dati con un'attività

La ricezione di dati con un'attività comporta l'aggiornamento del manifest, la gestione dei contenuti in arrivo e la garanzia che l'utente riconosca la tua app.

Aggiornare il manifest

I filtri per intent indicano al sistema quali intent accetta un componente dell'app. Analogamente a come hai creato un intent con un'azione ACTION_SEND nella lezione Invio di dati semplici ad altre app, crei filtri per 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à 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 uno di questi elementi creando un intent e passandolo a startActivity(), la tua applicazione viene elencata come opzione nell'Android Sharesheet o nel resolver di intent di Android. Se l'utente seleziona la tua app, viene avviata l'attività corrispondente (.ui.MyActivity nell'esempio precedente). Spetta poi a te gestire i contenuti in modo appropriato all'interno del codice e dell'interfaccia utente.

Gestire i contenuti in arrivo

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 dal launcher), prendi in considerazione questo aspetto 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 il 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 activity = LocalActivity.current
    val intent = activity?.intent

    when (intent?.action) {
        Intent.ACTION_SEND -> {
            if (intent.type == "text/plain") {
                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
        }
    }
}

private fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update UI state with the shared text
    }
}

private fun handleSendImage(intent: Intent) {
    val imageUri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUri?.let {
        // Update UI state with the shared image
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    val imageUris =
        IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUris?.let {
        // Update UI state with the shared images
    }
}

L'aggiornamento della UI dopo la ricezione dei dati può essere semplice come compilare un TextField, oppure può essere più complicato, ad esempio applicare un filtro fotografico interessante a un'immagine. Spetta alla tua app decidere cosa succede dopo.

Condivisione dell'URL dello screenshot

Quando acquisisci uno screenshot, puoi condividerlo insieme all'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 UI state with the shared image 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 e nel resolver di intent di Android. Entrambi sono definiti nel manifest. Puoi impostare etichette di filtri per attività o filtri per intent per fornire maggiori informazioni contestuali.

A partire da Android 10 (livello API 29), il foglio 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.