Tout comme une application peut envoyer des données à d'autres applications, elle peut également recevoir des données d'autres applications. Réfléchissez à la façon dont les utilisateurs interagissent avec votre application et quelles données types que vous souhaitez recevoir d’autres applications. Par exemple, un réseau social application de mise en réseau peut être intéressée par la réception de contenu textuel, comme un une URL Web intéressante, d'une autre application.
Les utilisateurs d'autres applications envoient fréquemment des données à votre application via Android. Sharesheet ou le résolveur d'intents. Les applications qui envoient des données à votre application doivent définir un le type MIME de ces données. Votre application peut recevoir des données envoyées par une autre application dans le de différentes manières:
- Un élément
Activity
avec une baliseintent-filter
correspondante dans le fichier manifeste - Partager les raccourcis publiés par votre application
Les cibles de partage direct sont des liens profonds vers une activité spécifique de votre application. Ils représentent souvent une personne ou un groupe, et l'Android Sharesheet les montre. Par exemple, une application de chat peut fournir une cible de partage direct à une personne qui des liens profonds directement dans une conversation avec cette personne. Voir Fournissez des cibles de partage direct pour obtenir instructions.
Compatibilité avec les types MIME
Dans l'idéal, 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/*
. En voici quelques-unes
les types MIME courants pour l'envoi et
la réception de données simples dans Android.
Les destinataires s'enregistrent pour | Les expéditeurs envoient |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Extensions de fichier compatibles | application/pdf |
Consultez le registre officiel des types de médias MIME de l'IANA.
Définissez des cibles de partage intéressantes
Lorsqu'un utilisateur appuie sur une cible de partage associée à une activité spécifique, devrait pouvoir confirmer et modifier le contenu partagé avant de l'utiliser. C'est ce qui est particulièrement important pour les données textuelles.
Recevoir des données avec une activité
La réception de données associées à une activité implique la mise à jour de votre fichier manifeste, la gestion des du contenu entrant et de s'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.
De la même manière que vous avez construit un intent avec une action ACTION_SEND
dans
Envoyer des données simples à d'autres applications
vous allez créer des filtres d'intent pour recevoir des intents avec cette action. Toi
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 suit :
<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 une
et le transmettre à startActivity()
, votre application
est répertoriée comme option dans 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). C'est ensuite à vous 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 diffusé par un Intent
, appelez
getIntent()
pour obtenir l'objet Intent
Une fois que vous avez l'objet,
vous pouvez examiner son contenu
pour déterminer la marche à suivre. Si cette activité peut
démarrer à partir d'autres parties du système (telles que le lanceur d'applications), prenez cette
lors de l'examen de l'intent.
Prenez particulièrement soin de vérifier les données entrantes, vous ne savez jamais ce que d'autres application peut vous envoyer. Par exemple, le mauvais type MIME 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").
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 de renseigner un EditText
, ou plus complexe, comme appliquer un filtre photo intéressant à une image. C'est à vous de
à votre application
ce qui se passe ensuite.
S'assurer que les utilisateurs reconnaissent votre application
Votre application est représentée par ses icon et label dans Android Sharesheet et résolveur d'intents. Tous deux sont définis dans le fichier manifeste. Vous pouvez définir des étiquettes de filtre d'activité ou d'intent pour fournir plus de contexte.
Depuis Android 10 (niveau d'API 29), Android Sharesheet n'utilise que des icônes définies dans
le fichier manifeste sur votre balise application
. Android ignore les icônes définies sur
Balises intent-filter
et activity
.