Android utilise des intents et leurs extras associés pour permettre aux utilisateurs de partager rapidement des informations à l'aide de leurs applications préférées.
Android offre deux façons aux utilisateurs de partager des données entre les applications :
- Android Sharesheet est principalement conçu pour envoyer du contenu en dehors de votre application et/ou directement à un autre utilisateur. Par exemple, pour partager une URL avec un ami.
- Le résolveur d'intent Android est plus adapté au transfert de données à l' étape suivante d'une tâche bien définie. Par exemple, pour ouvrir un PDF à partir de votre application et permettre aux utilisateurs de choisir leur lecteur préféré.
Lorsque vous créez un intent, vous spécifiez l'action que vous souhaitez qu'il effectue.
Android utilise l'action ACTION_SEND pour envoyer des données d'une activité à une autre, même au-delà des limites du processus. Vous devez spécifier les données et leur type. Le système identifie automatiquement les activités compatibles qui peuvent recevoir les données et les affiche à l'utilisateur. Dans le cas du résolveur d'intent, si une seule activité peut gérer l'intent, elle démarre immédiatement.
Pourquoi utiliser Android Sharesheet ?
Nous vous recommandons vivement d'utiliser Android Sharesheet pour offrir une expérience cohérente à vos utilisateurs dans toutes les applications. N'affichez pas la propre liste de cibles de partage de votre application ni ne créez vos propres variantes de Sharesheet.
Android Sharesheet permet aux utilisateurs de partager des informations avec la bonne personne, avec des suggestions d'applications pertinentes, le tout en un seul geste. Sharesheet peut suggérer des cibles qui ne sont pas disponibles pour les solutions personnalisées et utilise un classement cohérent. En effet, Sharesheet peut prendre en compte des informations sur l'activité de l'application et l'activité de l'utilisateur qui ne sont disponibles que pour le système.
Android Sharesheet offre également de nombreuses fonctionnalités pratiques pour les développeurs. Par exemple, vous pouvez effectuer les opérations suivantes :
- Découvrez quand vos utilisateurs effectuent un partage et où.
- Ajoutez une
ChooserTargetpersonnalisée et des cibles d'application. - Fournissez des aperçus de contenu en texte enrichi, à partir d'Android 10 (niveau d'API 29).
- Excluez les cibles correspondant à des noms de composants spécifiques.
Utiliser Android Sharesheet
Pour tous les types de partage, créez un intent et définissez son action sur Intent.ACTION_SEND.
Pour afficher Android Sharesheet, appelez
Intent.createChooser(),
en lui transmettant votre Intent objet.
Il renvoie une version de votre intent qui affiche toujours Android Sharesheet.
Envoyer du contenu textuel
L'utilisation la plus simple et la plus courante d'Android Sharesheet consiste à envoyer du contenu textuel d'une activité à une autre. Par exemple, la plupart des navigateurs peuvent partager l'URL de la page actuellement affichée sous forme de texte avec une autre application. Cela est utile pour partager un article ou un site Web avec des amis par e-mail ou sur les réseaux sociaux. Voici un exemple de procédure à suivre :
fun shareText(context: Context) { val sendIntent: Intent = Intent().apply { action = ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) context.startActivity(shareIntent) }
Vous pouvez également ajouter des extras pour inclure plus d'informations, telles que les destinataires de l'e-mail (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC), l'objet de l'e-mail (EXTRA_SUBJECT), etc.
Remarque : Certaines applications de messagerie, telles que Gmail, attendent un String[] pour les extras tels que EXTRA_EMAIL et EXTRA_CC. Utilisez putExtra(String, String[]) pour les ajouter à votre intent.
Envoyer du contenu binaire
Partagez des données binaires à l'aide de l'action ACTION_SEND.
Définissez le type MIME approprié et placez un URI vers les données dans l'extra EXTRA_STREAM, comme illustré dans l'exemple suivant.
Cette méthode est couramment utilisée pour partager une image, mais elle peut être utilisée pour partager n'importe quel type de contenu binaire.
fun shareBinaryContent(context: Context) { val shareIntent: Intent = Intent().apply { action = ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... val imageUri: Uri = Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1") putExtra(Intent.EXTRA_STREAM, imageUri) type = "image/jpeg" } context.startActivity(Intent.createChooser(shareIntent, null)) }
L'application de réception doit être autorisée à accéder aux données vers lesquelles pointe l'Uri. Voici deux méthodes recommandées pour ce faire :
- Stockez les données dans votre propre
ContentProvider, en vous assurant que les autres applications disposent de l'autorisation appropriée pour accéder à votre fournisseur. Le mécanisme préféré pour fournir un accès consiste à utiliser des autorisations par URI, qui sont temporaires et n'accordent l'accès qu'à l'application de réception. Pour créer unContentProviderde ce type, vous pouvez utiliser la classe d'assistanceFileProvider. - Utilisez le
MediaStoredu système. LeMediaStoreest principalement destiné aux types MIME vidéo, audio et image. Toutefois, à partir d'Android 3.0 (niveau d'API 11), il peut également stocker des types non multimédias. Pour en savoir plus, consultezMediaStore.Files. Les fichiers peuvent être insérés dans leMediaStoreà l'aide descanFile(), après quoi unUride stylecontent://adapté au partage est transmis au rappelonScanCompleted()fourni. Notez qu'une fois ajouté auMediaStoredu système, le contenu est accessible à n'importe quelle application sur l'appareil.
Utiliser le bon type MIME
Fournissez le type MIME le plus spécifique disponible pour les données que vous envoyez. Par exemple, utilisez text/plain lorsque vous partagez du texte brut. Voici quelques types MIME courants lors de l'envoi de données dans Android :
| Les récepteurs s'inscrivent pour | Les expéditeurs envoient |
|---|---|
text/* |
|
`image/*` |
|
video/* |
|
| Extensions de fichier compatibles | application/pdf |
Pour en savoir plus sur les types MIME, consultez le IANA registre officiel des types de médias MIME.
Android Sharesheet peut afficher un aperçu du contenu, en fonction du type MIME fourni. Certaines fonctionnalités d'aperçu ne sont disponibles que pour des types spécifiques.
Partager plusieurs éléments de contenu
Pour partager plusieurs éléments de contenu, utilisez l'action ACTION_SEND_MULTIPLE avec une liste d'URI pointant vers le contenu. Le type MIME varie en fonction du mélange de contenu que vous partagez. Par exemple, si vous partagez trois images JPEG, vous utilisez le type "image/jpg". Pour un mélange de types d'images, utilisez "image/*" pour correspondre à une activité qui gère n'importe quel type d'image. Bien qu'il soit possible de partager un mélange de types, nous vous le déconseillons vivement, car le destinataire ne sait pas clairement ce qui est censé être envoyé. Si vous devez envoyer plusieurs types, utilisez "*/*". Il appartient à l'application de réception d'analyser et de traiter vos données. Exemple :
fun shareMultiple(context: Context) { val imageUris: ArrayList<Uri> = arrayListOf( Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1"), Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/2") ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } context.startActivity(Intent.createChooser(shareIntent, null)) }
Assurez-vous que les objets Uri fournis pointent vers des données auxquelles une application de réception peut accéder.
Ajouter du contenu enrichi aux aperçus de texte
À partir d'Android 10 (niveau d'API 29), Android Sharesheet affiche un aperçu du texte partagé. Dans certains cas, le texte partagé peut être difficile à comprendre. Envisagez de partager une URL complexe telle que https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4. Un aperçu plus riche peut rassurer vos utilisateurs sur ce qui est partagé.
Si vous affichez un aperçu du texte, vous pouvez définir un titre, une miniature ou les deux. Ajoutez une description à Intent.EXTRA_TITLE avant d'appeler Intent.createChooser(), puis ajoutez une miniature pertinente à l'aide de ClipData.
Remarque : L'URI de contenu de l'image est fourni par un
FileProvider, généralement à partir d'un <cache-path> configuré.
Pour en savoir plus, consultez Partager des fichiers. Assurez-vous d'accorder à Sharesheet les autorisations appropriées pour lire les images que vous souhaitez utiliser comme miniatures. Pour en savoir plus, consultez Intent.FLAG_GRANT_READ_URI_PERMISSION.
Exemple :
fun richContentToTextPreviewShares(context: Context) { val share = Intent.createChooser( Intent().apply { action = ACTION_SEND putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/") // (Optional) Here you're setting the title of the content putExtra(Intent.EXTRA_TITLE, "Introducing content previews") // (Optional) Here you're passing a content URI to an image to be displayed data = Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/A123456789") flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null ) context.startActivity(share) }
L'aperçu se présente comme suit :
Ajouter des actions personnalisées à la Sharesheet
Capture d'écran des actions personnalisées sur Android Sharesheet.
Sur Android 14 (niveau d'API 34) et versions ultérieures, les applications peuvent ajouter des actions personnalisées à Android Sharesheet.
Les actions personnalisées sont affichées sous forme de petites icônes d'action en haut d'Android Sharesheet, et les applications peuvent spécifier n'importe quel Intent comme action appelée lorsque l'utilisateur clique sur l'icône.
Pour ajouter des actions personnalisées sur Android Sharesheet, créez d'abord une
ChooserAction
avec
ChooserAction.Builder.
Vous pouvez spécifier un PendingIntent comme action appelée lorsque l'utilisateur clique sur l'icône. Créez un tableau contenant toutes vos actions personnalisées et spécifiez-le comme EXTRA_CHOOSER_CUSTOM_ACTIONS du Intent de partage.
fun sharesheetCustomActions(context: Context, previewText: String) { val sendIntent = Intent(ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, previewText) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_logo), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent) }
Ajouter des cibles personnalisées
Android Sharesheet vous permet de spécifier jusqu'à deux objets ChooserTarget qui
s'affichent avant les raccourcis de partage et les cibles de sélecteur chargées à partir de ChooserTargetServices. Vous pouvez également spécifier jusqu'à deux intents pointant vers des activités qui sont listées avant les suggestions d'applications :
Ajoutez Intent.EXTRA_CHOOSER_TARGETS et Intent.EXTRA_INITIAL_INTENTS à votre intent de partage après avoir appelé Intent.createChooser() :
val share = Intent.createChooser(shareIntent, null).apply { putExtra( Intent.EXTRA_CHOOSER_TARGETS, arrayOf(chooserTargetJessica, chooserTargetSpyros) ) putExtra( Intent.EXTRA_INITIAL_INTENTS, arrayOf(intentTargetNearbyShare, intentTargetMaps) ) }
Utilisez cette fonctionnalité avec précaution. Chaque Intent et ChooserTarget personnalisés que vous ajoutez réduit le nombre de suggestions du système. En général, nous vous déconseillons d'ajouter des cibles personnalisées. Un exemple courant et approprié d'ajout de Intent.EXTRA_INITIAL_INTENTS consiste à fournir des actions supplémentaires que les utilisateurs peuvent effectuer sur le contenu partagé. Par exemple, un utilisateur partage des images et Intent.EXTRA_INITIAL_INTENTS lui permet d'envoyer un lien à la place. Un exemple courant et approprié d'ajout de Intent.EXTRA_CHOOSER_TARGETS consiste à afficher les personnes ou les appareils pertinents fournis par votre application.
Exclure des cibles spécifiques par composant
Vous pouvez exclure des cibles spécifiques en fournissant Intent.EXTRA_EXCLUDE_COMPONENTS.
Ne le faites que pour supprimer les cibles sur lesquelles vous avez le contrôle. Un cas d'utilisation courant consiste à masquer les cibles de partage de votre application lorsque vos utilisateurs partagent du contenu depuis votre application, car leur intention est probablement de partager en dehors de votre application.
Ajoutez Intent.EXTRA_EXCLUDE_COMPONENTS à votre intent après avoir appelé Intent.createChooser() :
fun excludeSpecificTargets(context: Context) { val share = Intent.createChooser(Intent(ACTION_SEND), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) } context.startActivity(share) }
Obtenir des informations sur le partage
Il peut être utile de savoir quand vos utilisateurs partagent du contenu et quelle cible ils sélectionnent. Android Sharesheet vous permet d'obtenir ces informations en fournissant le ComponentName des cibles que vos utilisateurs sélectionnent à l'aide d'un IntentSender.
Créez d'abord un PendingIntent pour un BroadcastReceiver et fournissez son IntentSender dans Intent.createChooser() :
fun infoAboutSharing(context: Context, requestCode: Int) { var share = Intent(ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( context, requestCode, Intent(context, ShareBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender) context.startActivity(share) }
Recevez le rappel dans MyBroadcastReceiver et recherchez dans Intent.EXTRA_CHOOSER_RESULT :
override fun onReceive(context: Context?, intent: Intent) { val TAG = ShareBroadcastReceiver::class.simpleName val chooserResult: ChooserResult? = IntentCompat.getParcelableExtra( intent, Intent.EXTRA_CHOOSER_RESULT, ChooserResult::class.java, ) chooserResult?.let { Log.i(TAG, "Share callback: isShortcut: ${it.isShortcut}, type: ${typeToString(it.type)}, componentName: ${it.selectedComponent}", ) } ?: Log.i(TAG, "chooserResult is null") }
Ajouter des actions personnalisées à la Sharesheet
Sur Android 14 (niveau d'API 34) et versions ultérieures, les applications peuvent ajouter des actions personnalisées à Android Sharesheet.
Créez une ChooserAction
avec
ChooserAction.Builder.
Vous pouvez spécifier un PendingIntent comme action appelée lorsque l'utilisateur clique sur l'icône. Créez un tableau contenant toutes vos actions personnalisées et spécifiez-le comme EXTRA_CHOOSER_CUSTOM_ACTIONS du Intent de partage.
fun customActions(context: Context, text: String) { val sendIntent = Intent(ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_logo), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent) }
Utiliser le résolveur d'intent Android
Capture d'écran du résolveur d'intent ACTION_SEND.
Le résolveur d'intent Android est plus adapté à l'envoi de données à une autre application dans le cadre d'un flux de tâches bien défini.
Pour utiliser le résolveur d'intent Android, créez un intent et ajoutez des extras comme vous le feriez pour appeler Android Sharesheet. Toutefois, n'appelez pas call
Intent.createChooser().
Si plusieurs applications installées comportent des filtres correspondant à ACTION_SEND et au type MIME, le système affiche une boîte de dialogue de désambiguïsation appelée résolveur d'intent qui permet à l'utilisateur de choisir une cible à partager. Si une seule application correspond, elle s'exécute.
Voici un exemple d'utilisation du résolveur d'intent Android pour envoyer du texte :
fun intentResolver(context: Context) { val sendIntent: Intent = Intent().apply { action = ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } context.startActivity(sendIntent) }
En savoir plus
Pour en savoir plus sur l'envoi de données, consultez Intents et filtres d'intent.