Ricevi dati semplici da altre app

Così come un'app può inviare dati ad altre app, può riceverne anche i dati da altre app di terze parti. Pensa a come gli utenti interagiscono con la tua applicazione e a quali dati che vuoi ricevere da altre applicazioni. Ad esempio, un social un'applicazione di networking potrebbe essere interessata a ricevere contenuti di testo, come una un URL web interessante, da un'altra app.

Gli utenti di altre app inviano spesso dati alla tua app tramite il Sharesheet o il resolver di intent. Le app che inviano dati alla tua app devono impostare un valore tipo MIME per i dati. La tua app può ricevere i dati inviati da un'altra app nell' nei seguenti modi:

  • Un elemento 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 vengono mostrati in Android Sharesheet. Ad esempio, un'app di messaggistica può fornire una destinazione della condivisione diretta per una persona che Link diretti che rimandano direttamente a una conversazione con quella persona. Consulta Indica i target della condivisione diretta per i dettagli istruzioni.

Supportare i tipi MIME

Idealmente, un'app deve essere in grado di ricevere il maggior numero possibile di tipi MIME. Ad esempio, un'app di messaggistica progettata per inviare testo, immagini e video supporta idealmente la ricezione di text/*, image/* e video/*. Ecco alcuni esempi tipi MIME comuni per l'invio e la ricezione di dati semplici in Android.

I destinatari si registrano a Invio dei 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 IANA dei tipi multimediali MIME.

Raggiungi ottimi obiettivi di condivisione

Quando un utente tocca un target di condivisione associato a un'attività specifica, dovrebbe 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 nuovi contenuti e assicurarti che l'utente riconosca la tua app.

Aggiornare il file manifest

I filtri per intent comunicano al sistema gli intent accettati da un componente dell'app. Simile a come hai creato un intent con un'azione ACTION_SEND nella sezione Invio di dati semplici ad altre app nella lezione precedente, crei filtri per intent per ricevere intent con questa azione. Tu definisci un filtro per intent nel file manifest utilizzando l'elemento <intent-filter>. Ad esempio, se l'app gestisce la ricezione di contenuti di testo, un file manifest che include una o più immagini di qualsiasi tipo simili 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 passarlo a startActivity(), la tua richiesta è elencata come opzione in Android Sharesheet o in intent resolver. Se l'utente seleziona la tua app, viene avviata l'attività corrispondente (.ui.MyActivity in dell'esempio precedente). Sta 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 pubblicati da una Intent, chiama getIntent() per ottenere l'oggetto Intent. Una volta ottenuto l'oggetto, puoi esaminarne i contenuti per decidere cosa fare. Se questa attività può essere avviato da altre parti del sistema (come l'Avvio app), da tenere in considerazione nell'esaminare l'intenzione.

Presta particolare attenzione a controllare i dati in arrivo, non si sa mai dall'applicazione. Ad esempio, potrebbe essere impostato il tipo MIME errato o il 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
    }
}

Aggiornare l'interfaccia utente dopo aver ricevuto i dati può essere semplice come compilare una EditText o può essere più complicata come l'applicazione di un filtro fotografico interessante a un'immagine. Sta a te cosa succederà dopo nella tua app.

Assicurati che gli utenti riconoscano la tua app

La tua app è rappresentata dai suoi icon e etichetta in Android Sharesheet e risolutore di intent. Entrambi sono definiti nel manifest. Puoi Impostare le etichette dei filtri per attività o intent per fornire maggiore contesto.

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