Recevoir des données d'autres applications

Tout comme une application peut envoyer des données à d'autres applications, elle peut également en recevoir. Réfléchissez à la façon dont les utilisateurs interagissent avec votre application et aux types de données que vous souhaitez recevoir d'autres applications. Par exemple, une application de réseau social peut vouloir recevoir du contenu textuel, comme une URL Web intéressante, d'une autre application.

Dans une application utilisant Compose Navigation, la réception de données envoyées par une autre application se fait en trois étapes :

  1. Déclarez un <intent-filter> dans le fichier manifeste : vous devez toujours ajouter un filtre d'intent à votre activité dans le fichier AndroidManifest.xml. Cela indique à l'OS Android que votre application est capable de recevoir des actions spécifiques (comme ACTION_SEND) et des types MIME (comme text/plain).

  2. Définissez un navDeepLink dans votre graphique de navigation Compose : associez un navDeepLink correspondant à l'action et au type MIME directement à la destination du composable qui doit afficher le contenu. NavController intercepte automatiquement l'intent entrant et redirige l'utilisateur directement vers cet écran.

  3. Extrayez la charge utile des données entrantes : sur l'écran de destination, accédez aux extras de l'intent (comme EXTRA_TEXT ou EXTRA_STREAM) pour récupérer le contenu partagé et mettre à jour l'état de votre UI.

Les cibles de partage direct sont des liens profonds vers une activité spécifique de votre application. Elles représentent souvent une personne ou un groupe, et l'Android Sharesheet les affiche. Par exemple, une application de chat peut fournir une cible de partage direct pour une personne qui crée un lien profond directement vers une conversation avec cette personne. Pour obtenir des instructions détaillées, consultez Fournir des cibles de partage direct.

Types MIME compatibles

Idéalement, une application doit pouvoir recevoir la plus large gamme possible de types MIME. Par exemple, une application de chat conçue pour envoyer du texte, des images et des vidéos doit idéalement accepter la réception de text/*, image/* et video/*. Voici quelques types MIME courants pour l'envoi et la réception de données dans Android.

Les récepteurs s'enregistrent pour Les expéditeurs envoient
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Extensions de fichier compatibles application/pdf

Consultez le registre officiel des types de médias MIME de l'IANA.

Créer des cibles de partage efficaces

Lorsque les utilisateurs appuient sur une cible de partage associée à une activité spécifique, permettez-leur de confirmer et de modifier le contenu partagé avant que votre application ne l'utilise. C'est particulièrement important pour les données textuelles.

Recevoir des données dans votre application

Pour recevoir des données partagées dans une application à l'aide de Compose, vous devez déclarer des filtres d'intent dans votre fichier manifeste, acheminer les intents entrants vers l'écran approprié à l'aide de liens profonds et extraire la charge utile de l'intent pour mettre à jour votre UI.

Mettre à jour votre fichier manifeste

Les filtres d'intent indiquent au système les intents qu'un composant d'application accepte. De la même manière que vous avez créé un intent avec une action ACTION_SEND dans la leçon Envoyer des données à d'autres applications, vous créez des filtres d'intent pour recevoir des intents avec cette action. Vous définissez un filtre d'intent dans votre fichier manifeste à l'aide de l'élément <intent-filter>. Par exemple, si votre application gère la réception de contenu textuel, un fichier manifeste incluant une ou plusieurs images de n'importe quel type se présentera comme l'extrait de code suivant :

<activity android:name=".ui.MyActivity" android:exported="true">
    <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>

Lorsqu'une autre application tente de partager l'un de ces éléments en créant un intent et en le transmettant à startActivity(), votre application est listée comme option dans l'Android Sharesheet ou le résolveur d'intent. Si l'utilisateur sélectionne votre application, l'activité correspondante est lancée (.ui.MyActivity dans l'exemple précédent). Il vous appartient ensuite de gérer le contenu de manière appropriée dans votre code et votre UI.

Dans Compose Navigation, associez un navDeepLink directement à la destination composable qui doit afficher le contenu. Lorsqu'une autre application partage des données correspondant à votre filtre d'intent, Compose Navigation redirige l'utilisateur directement vers cette destination :

Le navDeepLink correspond à l'action et au type MIME de l'intent entrant pour accéder à l'écran de destination approprié. Une fois sur cette destination, votre gestionnaire inspecte l'intent pour déterminer quelle charge utile a été reçue (par exemple, une seule image ou plusieurs images) et extrait les extras correspondants.

Gérer le contenu entrant

Pour récupérer le contenu diffusé par un Intent, lisez l'activité en cours à partir de LocalActivity.current dans votre composable, puis examinez l'intent pour déterminer la marche à suivre. Si cette activité peut être lancée à partir d'autres parties du système (comme le lanceur d'applications), tenez-en compte lorsque vous examinez l'intent.

Faites particulièrement attention à vérifier les données entrantes : un type MIME incorrect peut être défini, ou une image envoyée peut être extrêmement volumineuse. Traitez les données binaires ou les opérations d'E/S lourdes (comme le décodage d'images volumineuses ou l'écriture de fichiers) de manière asynchrone à l'aide de coroutines (comme Dispatchers.IO) plutôt que sur le thread UI principal.

@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
    }
}

Lorsque vous extrayez des données binaires ou des URI à partir d'extras d'intent (comme EXTRA_STREAM), utilisez IntentCompat.getParcelableExtra() ou IntentCompat.getParcelableArrayListExtra() de la bibliothèque AndroidX Core, comme indiqué dans les fonctions handleSendImage et handleSendMultipleImages précédentes. Android 13 (niveau d'API 33) abandonne la méthode Intent.getParcelableExtra(String) non paramétrée au profit de méthodes de type sécurisé qui acceptent le type de classe attendu.

La mise à jour de l'UI après la réception des données peut être aussi simple que la mise à jour de l'état pour renseigner un TextField, ou aussi complexe que l'application d'un filtre à une image. C'est à votre application de décider de la suite des événements.

Partage d'URL de capture d'écran

Lorsque vous effectuez une capture d'écran, vous pouvez la partager, ainsi que l'URL associée. Cela permet d'offrir une expérience utilisateur plus riche. Lorsque vous recevez une URL, veillez à récupérer le champ EXTRA_TEXT de l'intent, comme illustré dans l'exemple suivant :

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
}

S'assurer que les utilisateurs reconnaissent votre application

Votre application est représentée par son icône et son libellé dans l'Android Sharesheet et l'outil de résolution d'intent. Ces deux éléments sont définis dans le fichier manifeste. Vous pouvez définir des libellés de filtre d'activité ou d'intent pour fournir plus de contexte.

Depuis Android 10 (niveau d'API 29), Android Sharesheet n'utilise que les icônes définies dans le fichier manifeste de votre balise application. Android ignore les icônes définies sur les balises intent-filter et activity.

Recevoir du contenu enrichi

Bien que les intents ACTION_SEND permettent de recevoir des données de l'Android Sharesheet et du résolveur d'intents au niveau de l'activité ou de la navigation, les applications peuvent également recevoir du contenu enrichi (images, vidéos, fichiers audio et texte stylisé, par exemple) via des interactions directes avec l'interface utilisateur. Ces mécanismes incluent :

  • Coller depuis le presse-papiers (menu d'appui prolongé)
  • Insérer des contenus multimédias directement à partir du clavier virtuel (IME), comme des autocollants ou des GIF
  • Glisser-déposer du contenu depuis une autre application en mode multifenêtre ou écran partagé

Dans les UI basées sur les vues, Android 12 (niveau d'API 31) et AndroidX Core 1.7 introduisent l'API OnReceiveContentListener unifiée. Cet écouteur regroupe la gestion du contenu du presse-papiers, du clavier et du glisser-déposer dans un seul rappel. Pour obtenir des instructions détaillées sur l'implémentation de cette fonctionnalité dans les vues, consultez Recevoir du contenu enrichi.

Dans Jetpack Compose, vous pouvez gérer la réception de contenu enrichi inséré dans des composants d'interface utilisateur (comme des champs de texte) à l'aide du modificateur Modifier.contentReceiver ou des modificateurs de glisser-déposer.