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, provenant d'une autre application.
Les utilisateurs d'autres applications envoient fréquemment des données à votre application via la feuille de partage Android ou le résolveur d'intent. Les applications qui envoient des données à votre application doivent définir un type MIME pour ces données. Votre application peut recevoir des données envoyées par une autre application de différentes manières :
- Un
Activity
avec une baliseintent-filter
correspondante dans le fichier manifeste - Raccourcis de partage publiés par votre application.
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 messagerie peut fournir une cible de partage direct pour une personne qui établit un lien profond directement vers une conversation avec cette personne. Pour obtenir des instructions détaillées, consultez Spécifier des cibles de partage direct.
Types MIME acceptés
Idéalement, une application doit pouvoir recevoir la plus large gamme possible de types MIME.
Par exemple, une application de messagerie 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 simples dans Android.
Les destinataires s'inscrivent à | Expéditeurs |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Extensions de fichier acceptées | application/pdf |
Consultez le registre officiel des types de médias MIME de l'IANA.
Créer des cibles de partage efficaces
Lorsqu'un utilisateur appuie sur une cible de partage associée à une activité spécifique, il doit pouvoir confirmer et modifier le contenu partagé avant de l'utiliser. C'est particulièrement important pour les données textuelles.
Recevoir des données avec une activité
Pour recevoir des données avec une activité, vous devez mettre à jour votre fichier manifeste, gérer le contenu entrant et vous assurer que l'utilisateur reconnaît votre application.
Mettre à jour votre fichier manifeste
Les filtres d'intent indiquent au système les intents acceptés par un composant d'application.
Comme vous avez créé un intent avec une action ACTION_SEND
dans la leçon Envoyer des données simples à 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 ressemblerait à l'extrait suivant :
<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>
Lorsqu'une autre application tente de partager l'un de ces éléments en construisant un intent et en le transmettant à startActivity()
, votre application est listée comme option dans la feuille de partage ou le résolveur d'intent Android. Si l'utilisateur sélectionne votre application, l'activité correspondante (.ui.MyActivity
dans l'exemple précédent) est lancée. Il vous appartient ensuite de gérer le contenu de manière appropriée dans votre code et votre UI.
Gérer le contenu entrant
Pour gérer le contenu fourni par un Intent
, appelez getIntent()
pour obtenir l'objet Intent
. Une fois l'objet obtenu, vous pouvez examiner son contenu pour déterminer la marche à suivre. Si cette activité peut être démarrée à partir d'autres parties du système (comme le lanceur d'applications), tenez-en compte lorsque vous examinez l'intent.
Soyez particulièrement vigilant lorsque vous vérifiez les données entrantes. Vous ne savez jamais ce qu'une autre application peut vous envoyer. Par exemple, le type MIME incorrect peut être défini ou l'image envoyée peut être extrêmement volumineuse. N'oubliez pas non plus de traiter les données binaires dans un thread distinct du thread principal ("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 } }
La mise à jour de l'UI après réception des données peut être aussi simple que le remplissage d'un EditText
, ou plus complexe, comme l'application d'un filtre photo intéressant à une image. La suite dépend de votre application.
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 et le sélecteur d'intent Android. Ces deux éléments sont définis dans le fichier manifeste. Vous pouvez définir des libellés de filtres d'activité ou d'intent pour fournir plus de contexte.
Depuis 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 balise application
. Android ignore les icônes définies sur les balises intent-filter
et activity
.