Ricevi dati semplici da altre app

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 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 interessante URL web, da un'altra app.

Gli utenti di altre app inviano spesso dati alla tua app tramite il foglio di condivisione Android o lo strumento di risoluzione degli intent. Le app che inviano dati alla tua app devono impostare un tipo MIME per tali dati. La tua app può ricevere i dati inviati da un'altra app nei seguenti modi:

  • Un Activity con un tag intent-filter corrispondente nel file manifest
  • Condivisione delle scorciatoie pubblicate dalla tua app.

I target della condivisione diretta sono link diretti a un'attività specifica all'interno dell'app. Spesso rappresentano una persona o un gruppo e sono mostrati nel foglio di condivisione di Android. Ad esempio, un'app di messaggistica può fornire un target per la condivisione diretta a una persona che rimanda direttamente a una conversazione con quella persona. Per istruzioni dettagliate, consulta Fornire target per la condivisione diretta.

Supporta i tipi MIME

Idealmente, un'app deve essere in grado di ricevere la gamma più ampia di tipi MIME possibile. 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.

Registrazione dei ricevitori per I mittenti inviano
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 contenuti multimediali MIME IANA.

Crea obiettivi di condivisione efficaci

Quando un utente tocca una destinazione di condivisione associata 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 di dati con un'attività comporta l'aggiornamento del file manifest, la gestione dei contenuti in arrivo e la garanzia che l'utente riconosca la tua app.

Aggiorna il manifest

I filtri di intent comunicano al sistema gli intent accettati da un componente dell'app. In modo simile a come hai creato un intent con un'azione ACTION_SEND nella lezione Invio di dati semplici ad altre app, puoi creare filtri per intent per ricevere intent con questa azione. Puoi definire un filtro per intent nel manifest utilizzando l'elemento <intent-filter>. Ad esempio, se l'app gestisce la ricezione di contenuti di testo, un manifest che include una o più immagini di qualsiasi tipo avrà il 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 questi elementi creando un intent e passandolo a startActivity(), la tua applicazione viene elencata come opzione in Android Sharesheet o nel resolver dell'intent. Se l'utente seleziona la tua app, viene avviata l'attività corrispondente (.ui.MyActivity nell'esempio precedente). Spetta quindi a te gestire i contenuti in modo appropriato all'interno del tuo codice e della tua interfaccia utente.

Gestisci i contenuti in arrivo

Per gestire i contenuti pubblicati da Intent, chiama getIntent() per ottenere l'oggetto Intent. Una volta ottenuto l'oggetto, puoi esaminarne i contenuti per stabilire l'azione successiva. Se questa attività può essere avviata da altre parti del sistema (ad esempio Avvio app), tienilo presente quando esamini l'intento.

Presta particolare attenzione a controllare i dati in arrivo, non sai mai cosa potrebbe inviarti un'altra applicazione. Ad esempio, potrebbe essere impostato il tipo MIME errato o l'immagine inviata potrebbe essere molto 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 della UI dopo aver ricevuto i dati può essere semplice, come la compilazione di un EditText, o può essere più complicato come l'applicazione di un filtro fotografico interessante a un'immagine. La decisione spetta alla tua app.

Assicurati che gli utenti riconoscano la tua app

La tua app è rappresentata dalla relativa icona e dall'etichetta nel foglio di condivisione di Android e nel resolver dell'intent. Entrambi sono definiti nel manifest. Puoi impostare etichette di filtri per intent o attività per fornire maggiore contesto.

A partire da Android 10 (livello API 29), il foglio di condivisione Android utilizza solo le icone impostate nel file manifest nel tag application. Android ignora le icone impostate sui tag intent-filter e activity.