Envoyer des données simples à d'autres applications

Android utilise des intents et leurs extras associés pour permettre aux utilisateurs de partager des informations rapidement et facilement à l'aide de leurs applications préférées.

Android propose deux façons pour les utilisateurs de partager des données entre les applications :

  • La feuille de partage Android est principalement conçue pour envoyer du contenu en dehors de votre application et/ou directement à un autre utilisateur. Par exemple, partager une URL avec un ami.
  • Le résolveur d'intent Android est le mieux adapté au transfert de données vers la prochaine étape d'une tâche bien définie. Par exemple, ouvrir un PDF depuis votre application et laisser les utilisateurs choisir leur lecteur préféré.

Lorsque vous créez une intention, vous spécifiez l'action que vous souhaitez qu'elle 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 pouvant 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, cette activité démarre immédiatement.

Pourquoi utiliser Android Sharesheet ?

Nous vous recommandons vivement d'utiliser la feuille de partage Android 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 et ne créez pas vos propres variantes de feuille de partage.

La feuille de partage Android permet aux utilisateurs de partager des informations avec la bonne personne, avec des suggestions d'applications pertinentes, le tout en un seul geste. La feuille de partage peut suggérer des cibles qui ne sont pas disponibles pour les solutions personnalisées et utilise un classement cohérent. En effet, la feuille de partage peut prendre en compte des informations sur l'activité des applications et des utilisateurs qui ne sont disponibles que pour le système.

La feuille de partage Android propose également de nombreuses fonctionnalités pratiques pour les développeurs. Par exemple, vous pouvez effectuer les opérations suivantes :

Utiliser Android Sharesheet

Pour tous les types de partage, créez un intent et définissez son action sur Intent.ACTION_SEND. Pour afficher la feuille de partage Android, appelez Intent.createChooser() en lui transmettant votre objet Intent. Elle renvoie une version de votre intention qui affiche toujours la feuille de partage Android.

Envoyer du contenu textuel

L'utilisation la plus simple et la plus courante de la feuille de partage Android 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 :

Kotlin

val sendIntent: Intent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
    type = "text/plain"
}

val shareIntent = Intent.createChooser(sendIntent, null)
startActivity(shareIntent)

Java

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");

Intent shareIntent = Intent.createChooser(sendIntent, null);
startActivity(shareIntent);

Vous pouvez également ajouter des extras pour inclure plus d'informations, comme 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, comme Gmail, attendent un String[] pour les extras tels que EXTRA_EMAIL et EXTRA_CC. Utilisez putExtra(String, String[]) pour les ajouter à votre intention.

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 indiqué dans l'exemple suivant. Cette méthode est couramment utilisée pour partager une image, mais elle peut servir à partager n'importe quel type de contenu binaire.

Kotlin

val shareIntent: Intent = Intent().apply {
    action = Intent.ACTION_SEND
    // Example: content://com.google.android.apps.photos.contentprovider/...
    putExtra(Intent.EXTRA_STREAM, uriToImage)
    type = "image/jpeg"
}
startActivity(Intent.createChooser(shareIntent, null))

Java

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
// Example: content://com.google.android.apps.photos.contentprovider/...
shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
shareIntent.setType("image/jpeg");
startActivity(Intent.createChooser(shareIntent, null));

L'application de réception doit être autorisée à accéder aux données vers lesquelles pointe Uri. Il existe deux méthodes recommandées :

  • 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 privilégié pour fournir un accès consiste à utiliser des autorisations par URI, qui sont temporaires et n'accordent l'accès qu'à l'application destinataire. Pour créer un ContentProvider comme celui-ci, le plus simple est d'utiliser la classe d'assistance FileProvider.
  • Utilisez le système MediaStore. MediaStore est 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, consultez MediaStore.Files. Les fichiers peuvent être insérés dans MediaStore à l'aide de scanFile(), après quoi un Uri de style content:// adapté au partage est transmis au rappel onScanCompleted() fourni. Notez qu'une fois ajouté au système MediaStore, le contenu est accessible à toutes les applications de l'appareil.

Utiliser le bon type MIME

Indiquez 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 pour l'envoi de données simples dans Android :

Les destinataires s'inscrivent à Expéditeurs
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Extensions de fichier acceptées application/pdf

Pour en savoir plus sur les types MIME, consultez le registre officiel des types de médias MIME de l'IANA.

La feuille de partage Android peut afficher un aperçu du contenu, en fonction du type MIME fourni. Certaines fonctionnalités d'aperçu ne sont disponibles que pour certains types.

Partager plusieurs contenus

Pour partager plusieurs contenus, utilisez l'action ACTION_SEND_MULTIPLE avec une liste d'URI pointant vers les contenus. Le type MIME varie en fonction du mélange de contenus 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 faire correspondre une activité qui gère n'importe quel type d'image. Bien qu'il soit possible de partager différents types de contenus, nous vous le déconseillons vivement, car le destinataire ne saura pas ce que vous avez voulu lui envoyer. Si vous devez envoyer plusieurs types, utilisez "*/*". Il incombe à l'application destinataire d'analyser et de traiter vos données. Exemple :

Kotlin

val imageUris: ArrayList<Uri> = arrayListOf(
        // Add your image URIs here
        imageUri1,
        imageUri2
)

val shareIntent = Intent().apply {
    action = Intent.ACTION_SEND_MULTIPLE
    putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris)
    type = "image/*"
}
startActivity(Intent.createChooser(shareIntent, null))

Java

ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris.add(imageUri1); // Add your image URIs here
imageUris.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");
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), la feuille de partage Android affiche un aperçu du texte partagé. Dans certains cas, le texte partagé peut être difficile à comprendre. Envisagez de partager une URL complexe comme https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4. Un aperçu plus riche peut rassurer vos utilisateurs sur ce qui est partagé.

Si vous prévisualisez du texte, vous pouvez définir un titre, une miniature ou les deux. Ajoutez une description àIntent.EXTRA_TITLE avant d'appeler Intent.createChooser(), et ajoutez une miniature pertinente à l'aide de ClipData.

Remarque : L'URI du contenu de l'image est fourni à partir d'un FileProvider, généralement à partir d'un <cache-path> configuré. Pour en savoir plus, consultez Partager des fichiers. Veillez à accorder à Sharesheet les autorisations nécessaires pour lire les images que vous souhaitez utiliser comme miniatures. Pour en savoir plus, consultez Intent.FLAG_GRANT_READ_URI_PERMISSION.

Exemple :

Kotlin

 val share = Intent.createChooser(Intent().apply {
      action = Intent.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 = contentUri
      flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
  }, null)
  startActivity(share)

Java

Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/");

// (Optional) Here you're setting the title of the content
sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews");

// (Optional) Here you're passing a content URI to an image to be displayed
sendIntent.setData(contentUri);
sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

// Show the Sharesheet
startActivity(Intent.createChooser(sendIntent, null));

L'aperçu ressemble à ceci :

Ajouter des actions personnalisées à la feuille de partage

Capture d'écran des actions personnalisées sur la feuille de partage Android.

Sur Android 14 (niveau d'API 34) et versions ultérieures, les applications peuvent ajouter des actions personnalisées à la Sharesheet Android. Les actions personnalisées sont affichées sous forme de petites icônes d'action en haut de la feuille de partage Android. Les applications peuvent spécifier n'importe quel Intent comme action à invoquer lorsque l'utilisateur clique sur l'icône.

Pour ajouter des actions personnalisées à la Sharesheet Android, commencez par créer un ChooserAction avec ChooserAction.Builder. Vous pouvez spécifier un PendingIntent comme action à invoquer lorsque l'utilisateur clique sur l'icône. Créez un tableau contenant toutes vos actions personnalisées et spécifiez-le en tant que EXTRA_CHOOSER_CUSTOM_ACTIONS de l'Intent de partage.

Kotlin

val sendIntent = Intent(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_custom_action),
        "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)

Java

Intent sendIntent = new Intent(Intent.ACTION_SEND)
        .setType("text.plain")
        .putExtra(Intent.EXTRA_TEXT, text);
Intent shareIntent = Intent.createChooser(sendIntent, null);
ChooserAction[] actions = new ChooserAction[]{
        new ChooserAction.Builder(
                Icon.createWithResource(context, R.drawable.ic_custom_action),
                "Custom",
                PendingIntent.getBroadcast(
                        context,
                        1,
                        new Intent(Intent.ACTION_VIEW),
                        PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT
                )
        ).build()
};
shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions);
context.startActivity(shareIntent);

Ajouter des cibles personnalisées

La feuille de partage Android vous permet de spécifier jusqu'à deux objets ChooserTarget qui sont affichés avant les raccourcis de partage et les cibles du sélecteur chargés à partir de ChooserTargetServices. Vous pouvez également spécifier jusqu'à deux intents pointant vers des activités listées avant les suggestions d'applications :

Ajoutez Intent.EXTRA_CHOOSER_TARGETS et Intent.EXTRA_INITIAL_INTENTS à votre Intent de partage après l'appel de Intent.createChooser() :

Kotlin

val share = Intent.createChooser(myShareIntent, null).apply {
    putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray)
    putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray)
}

Java

Intent shareIntent = Intent.createChooser(sendIntent, null);
share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray);
share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);

Utilisez cette fonctionnalité avec prudence. Chaque Intent et ChooserTarget personnalisés que vous ajoutez réduit le nombre suggéré par le système. Nous vous déconseillons généralement d'ajouter des cibles personnalisées. Un exemple courant 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 est utilisé pour lui permettre d'envoyer un lien à la place. Un exemple courant 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 ils souhaitent probablement le partager en dehors de votre application.

Ajoutez Intent.EXTRA_EXCLUDE_COMPONENTS à votre intent après avoir appelé Intent.createChooser() :

Kotlin

  val share = Intent.createChooser(Intent(), null).apply {
    // Only use for components you have control over
    val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass"))
    putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames)
  }

Java

  Intent shareIntent = Intent.createChooser(new Intent(), null);
  // Only use for components you have control over
  ComponentName[] excludedComponentNames = {
          new ComponentName("com.example.android", "ExampleClass")
  };
  shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);

Obtenir des informations sur le partage

Il peut être utile de savoir quand vos utilisateurs partagent des contenus et quelle cible ils sélectionnent. La feuille de partage Android vous permet d'obtenir ces informations en fournissant le ComponentName des cibles que vos utilisateurs sélectionnent à l'aide d'un IntentSender.

Commencez par créer un PendingIntent pour un BroadcastReceiver et fournissez son IntentSender dans Intent.createChooser() :

Kotlin

var share = Intent(Intent.ACTION_SEND)
// ...
val pi = PendingIntent.getBroadcast(
    myContext, requestCode,
    Intent(myContext, MyBroadcastReceiver::class.java),
    PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
share = Intent.createChooser(share, null, pi.intentSender)

Java

Intent share = new Intent(ACTION_SEND);
...
PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode,
        new Intent(myContext, MyBroadcastReceiver.class),
        PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
share = Intent.createChooser(share, null, pi.getIntentSender());

Recevez le rappel dans MyBroadcastReceiver et recherchez dans Intent.EXTRA_CHOSEN_COMPONENT :

Kotlin

override fun onReceive(context: Context, intent: Intent) {
  ...
  val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT);
}

Java

@Override public void onReceive(Context context, Intent intent) {
  ...
  ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT);
}

Ajouter des actions personnalisées à la feuille de partage

Sur Android 14 (niveau d'API 34) et versions ultérieures, les applications peuvent ajouter des actions personnalisées à la Sharesheet Android. Créez un ChooserAction avec ChooserAction.Builder. Vous pouvez spécifier un PendingIntent comme action à invoquer lorsque l'utilisateur clique sur l'icône. Créez un tableau contenant toutes vos actions personnalisées et spécifiez-le en tant que EXTRA_CHOOSER_CUSTOM_ACTIONS de l'Intent de partage.

Kotlin

val sendIntent = Intent(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_custom_action),
        "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)

Java

Intent sendIntent = new Intent(Intent.ACTION_SEND)
        .setType("text.plain")
        .putExtra(Intent.EXTRA_TEXT, text);
Intent shareIntent = Intent.createChooser(sendIntent, null);
ChooserAction[] actions = new ChooserAction[]{
        new ChooserAction.Builder(
                Icon.createWithResource(context, R.drawable.ic_custom_action),
                "Custom",
                PendingIntent.getBroadcast(
                        context,
                        1,
                        new Intent(Intent.ACTION_VIEW),
                        PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT
                )
        ).build()
};
shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions);
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 idéal pour envoyer des 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 la feuille de partage Android. Toutefois, n'appelez pas 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 sélection appelée résolveur d'intent, qui permet à l'utilisateur de choisir une cible pour le partage. Si une seule application correspond, elle s'exécute.

Voici un exemple d'utilisation du résolveur d'intent Android pour envoyer du texte :

Kotlin

val sendIntent: Intent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
    type = "text/plain"
}
startActivity(sendIntent)

Java

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
startActivity(sendIntent);

En savoir plus

Pour en savoir plus sur l'envoi de données, consultez Intents et filtres d'intent.