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, à partir d'une autre application.
Dans une application utilisant Compose Navigation, la réception de données envoyées par une autre application s'effectue en deux étapes :
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).Définissez un navDeepLink dans votre graphique Compose Navigation : au lieu d'intercepter et d'analyser manuellement l'intent dans les méthodes onCreate ou onNewIntent de votre activité, utilisez la compatibilité avec les liens profonds de Compose Navigation. Associez un navDeepLink qui correspond à l'action et au type MIME directement à la destination composable qui doit afficher le contenu. Le NavController interceptera automatiquement l'intent et redirigera l'utilisateur directement vers cet écran.
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. Consultez la section Spécifier des cibles de partage direct pour obtenir des instructions détaillées.
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 être compatible avec 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 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
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. Cela est particulièrement important pour les données textuelles.
Recevoir des données avec une activité
La réception de données avec une activité implique la mise à jour de votre fichier manifeste, la gestion du contenu entrant et la reconnaissance de votre application par l'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 simples vers 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" > <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.
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 lancé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. 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 plutôt que dans le thread principal ("UI").
@Composable fun SharesheetHandler() { val context = LocalContext.current val intent = (context as? Activity)?.intent when (intent?.action) { 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_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 } } } fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update ViewModel state to change state of text being shared } } fun handleSendImage(intent: Intent) { IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Update ViewModel state to change state of image being shared } } fun handleSendMultipleImages(intent: Intent) { IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Update ViewModel state to change state of image(s) being shared } }
La mise à jour de l'interface utilisateur après la réception des données peut être aussi simple que le remplissage d'un
TextField
, ou plus
complexe, comme l'application d'un filtre photo intéressant à 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 ViewModel state to change state image being shared 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 balise application. Android ignore les icônes définies sur les balises intent-filter et activity.