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 être intéressée par la réception de contenu textuel, comme une URL Web intéressante, depuis une autre application.
Dans une application utilisant Compose Navigation, la réception de données envoyées par une autre application se déroule en trois étapes :
Déclarez un
<intent-filter>dans le fichier manifeste : vous devez toujours ajouter un filtre d'intent à votre activité dans le fichierAndroidManifest.xml. Cela indique à l'OS Android que votre application est capable de recevoir des actions spécifiques (commeACTION_SEND) et des types MIME (commetext/plain).Définissez un
navDeepLinkdans votre graphique Compose Navigation : associez unnavDeepLinkqui correspond à l'action et au type MIME directement à la destination composable qui doit afficher le contenu. LeNavControllerintercepte automatiquement l'intent entrant et redirige l'utilisateur directement vers cet écran.Extrayez la charge utile des données entrantes : dans l'écran de destination, accédez aux extras d'intent (tels que
EXTRA_TEXTouEXTRA_STREAM) pour récupérer le contenu partagé et mettre à jour l'état de votre interface utilisateur.
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 la feuille de partage Android 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 la section Fournir des cibles de partage direct.
Types MIME compatibles
Idéalement, une application doit être en mesure de 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 prendre en charge 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'inscrivent pour | Les expéditeurs envoient |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| Extensions de fichier compatibles | application/pdf |
Consultez le registre officiel IANA des types de média MIME.
Créer des cibles de partage efficaces
Lorsque les utilisateurs appuient sur une cible de partage associée à une activité spécifique, laissez-les confirmer et modifier le contenu partagé avant que votre application ne l'utilise. Cela est particulièrement important pour les données textuelles.
Recevoir des données dans votre application
La réception de données partagées dans une application à l'aide de Compose implique de déclarer des filtres d'intent dans votre fichier manifeste, de router les intents entrants vers l'écran approprié à l'aide de liens profonds et d'extraire la charge utile de l'intent pour mettre à jour votre interface utilisateur.
Mettre à jour votre fichier manifeste
Les filtres d'intent indiquent au système les intents qu'un composant d'application accepte. Comme 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 qui inclut une ou plusieurs images de n'importe quel type se présente comme l'extrait 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 répertoriée
comme option dans la feuille de partage Android ou le résolveur d'intent. Si l'utilisateur sélectionne votre application, l'activité correspondante démarre (.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 interface utilisateur.
Définir un lien profond dans votre graphique de navigation
Dans Compose Navigation, associez un navDeepLink directement à la destination composable qui doit afficher le contenu. Lorsqu'une autre application partage des données qui correspondent à votre filtre d'intent, Compose Navigation redirige l'utilisateur directement vers cette destination :
composable( route = "incoming_share", deepLinks = listOf( navDeepLink { action = Intent.ACTION_SEND mimeType = "text/plain" }, navDeepLink { action = Intent.ACTION_SEND mimeType = "image/*" }, navDeepLink { action = Intent.ACTION_SEND_MULTIPLE mimeType = "image/*" } ) ) { SharesheetHandler() }
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 la charge utile 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 fourni par un Intent, lisez l'activité actuelle à partir de LocalActivity.current dans votre composable, puis examinez l'intent pour déterminer la marche à suivre. Si cette activité peut être démarrée à partir d'autres parties du système (comme le lanceur), tenez-en compte lorsque vous examinez l'intent.
Soyez particulièrement vigilant lorsque vous vérifiez les données entrantes : le type MIME peut être incorrect 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 (tels que EXTRA_STREAM),
utilisez IntentCompat.getParcelableExtra() ou
IntentCompat.getParcelableArrayListExtra()
à partir de la bibliothèque AndroidX Core, comme illustré dans les fonctions handleSendImage et
handleSendMultipleImages précédentes. Android 13 (niveau d'API 33) déconseille la méthode Intent.getParcelableExtra(String) non paramétrée au profit de méthodes de sécurité des types qui prennent le type de classe attendu.
La mise à jour de l'interface utilisateur après la réception des données peut être aussi simple que la mise à jour de l'état pour remplir un TextField, ou aussi complexe que l'application d'un filtre à une image. La suite dépend de votre application.
Partage d'URL de capture d'écran
Lorsque vous prenez une capture d'écran, vous pouvez la partager ainsi que toute URL associée.
Cela offre une expérience utilisateur plus riche. Lorsque vous recevez une URL, assurez-vous d'obtenir 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 la feuille de partage Android et le résolveur d'intent. Ces deux éléments sont définis dans le fichier manifeste. Vous pouvez définir des libellés d'activité ou de filtre d'intent pour fournir plus de contexte.
À partir d'Android 10 (niveau d'API 29), la feuille de partage Android n'utilise que les icônes définies dans le fichier manifeste sur votre tag application. Android ignore les icônes définies sur les tags intent-filter et activity.
Recevoir du contenu enrichi
Alors que les intents ACTION_SEND permettent de recevoir des données de la feuille de partage Android et du résolveur d'intent au niveau de l'activité ou de la navigation, les applications peuvent également recevoir du contenu enrichi (comme des images, des vidéos, des fichiers audio et du texte stylisé) via des interactions directes avec l'interface utilisateur. Ces mécanismes incluent les suivants :
- Coller depuis le presse-papiers (menu "Appuyer de manière prolongée")
- Insérer des éléments multimédias directement depuis le 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 interfaces utilisateur basées sur des vues, Android 12 (niveau d'API 31) et AndroidX Core 1.7 introduisent l'
unifiée OnReceiveContentListener API. Cet écouteur consolide la gestion du contenu à partir 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
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 (tels que des champs de texte) à l'aide du
Modifier.contentReceiver modificateur ou
des modificateurs de glisser-déposer.