Envoyer des données simples à d'autres applications

Android utilise les intents et les 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 aux utilisateurs deux méthodes pour partager des données entre les applications:

  • Android Sharesheet est principalement conçue pour envoyer du contenu en dehors de votre application et/ou directement à un autre utilisateur. Par exemple, vous pouvez partager une URL avec un ami.
  • Le résolveur d'intent Android est le mieux adapté pour transmettre des données au l'étape suivante d'une tâche bien définie. Par exemple, ouvrir un PDF depuis votre application et permettre aux utilisateurs choisir leur lecteur préféré.

Lorsque vous créez un intent, vous spécifiez l'action qu'il doit effectuer. Android utilise l'action ACTION_SEND d'envoyer des données d'une activité à une autre, même au-delà des limites des processus. Vous devez spécifier les données et leur type. Le système identifie automatiquement les activités compatibles qui reçoit 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 Android Sharesheet pour assurer la cohérence pour vos utilisateurs sur applications. Ne pas afficher la liste des cibles de partage de votre appli et ne pas créer la vôtre Variantes Sharesheet.

Android Sharesheet permet aux utilisateurs de partager des informations avec le la bonne personne, avec des suggestions d'applications pertinentes, le tout d'un simple geste. Sharesheet peut suggérer des cibles indisponibles pour les solutions personnalisées et utilise un classement cohérent. En effet, la Sharesheet peut prendre en compte les informations sur l’activité de l’application et de l’utilisateur qui n'est disponible 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:

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 objet Intent. Elle 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 texte à partir de d'une activité à une autre. Par exemple, la plupart des navigateurs peuvent partager l'URL de la page sous forme de texte avec une autre application. Cela s'avère utile pour partager un article ou un site Web avec des amis via 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 éventuellement ajouter des éléments supplémentaires pour inclure d'autres informations, telles que les destinataires d'e-mails (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC), l'objet de l'e-mail (EXTRA_SUBJECT), etc.

Remarque:Certaines applications de messagerie, telles que Gmail, requièrent String[] pour des bonus comme EXTRA_EMAIL et EXTRA_CC. Utilisez putExtra(String, String[]) pour les ajouter à votre intent.

Envoyer un contenu binaire

Partagez des données binaires à l'aide de l'action ACTION_SEND. Définissez le type MIME approprié et placez un URI pour les données dans EXTRA_STREAM, en tant que comme illustré dans l'exemple suivant. Cette méthode est couramment utilisée pour partager une image, mais elle peut également 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 réceptrice a besoin d'une autorisation pour accéder aux données du Uri. vers lequel pointe l'élément. Deux méthodes sont recommandées:

  • Stockez les données dans votre propre ContentProvider, en vous assurant que les autres applications disposent des autorisations appropriées pour accéder à votre fournisseur. Le mécanisme privilégié pour fournir consiste à utiliser des autorisations par URI, qui sont temporaire et n’accorde l’accès qu’à l’application réceptrice. Un moyen simple de créer ContentProvider comme ceci consiste à utiliser la Classe d'assistance FileProvider.
  • Utilisez le système MediaStore. MediaStore est principalement destiné aux types MIME des vidéos, de l'audio et des images. Toutefois, à partir d'Android 3.0 (API niveau 11), il peut également stocker des types autres que des médias. Pour en savoir plus, consultez MediaStore.Files Les fichiers peuvent être insérés dans le MediaStore à l'aide de scanFile(), après quoi une Uri de style content:// pouvant être partagé est transmis au fournisseur onScanCompleted() . Notez qu'une fois ajouté au système MediaStore, le contenu est accessible aux n'importe quelle application de l'appareil.

Utiliser le type MIME approprié

Indiquez le type MIME le plus spécifique disponible pour les données l'envoi. Par exemple, utilisez text/plain lorsque vous partagez du texte brut. En voici quelques-unes types MIME courants lors de l'envoi de données simples dans Android:

Les destinataires s'enregistrent pour Les expéditeurs envoient
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Extensions de fichier compatibles application/pdf

<ph type="x-smartling-placeholder">

Pour plus d'informations sur les types MIME, consultez la IANA registre officiel des types de médias MIME.

Android Sharesheet peut afficher un aperçu du contenu, en fonction du type MIME fourni. Un peu les fonctionnalités en preview ne sont disponibles que pour des types spécifiques.

Partager plusieurs éléments de contenu

Pour partager plusieurs contenus, utilisez l'ACTION_SEND_MULTIPLE associée à une liste d'URI pointant vers le contenu. Le type MIME varie en fonction du les différents types de contenus que vous partagez. Par exemple, si vous partagez trois images JPEG, vous utilisez le type "image/jpg" Pour combiner différents types d'images, utilisez "image/*" pour trouver une correspondance qui gère n'importe quel type d'image. Même s'il est possible de partager plusieurs types d'informations, découragez cela, car il est au destinataire ce qui est destiné à être envoyé n'est pas clair. S'il est nécessaire d'envoyer plusieurs types, utilisez "*/*" C'est à l'application réceptrice d'analyser et 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 aux données auxquelles une application réceptrice 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 en cours partagés. Dans certains cas, le texte partagé peut être difficile à comprendre. Envisagez de partager une une URL complexe, comme https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4. Un environnement plus riche l'aperçu rassure les utilisateurs sur ce qui est partagé.

Si vous prévisualisez du texte, vous pouvez définir un titre, une vignette ou les deux. Ajoutez une description à Intent.EXTRA_TITLE avant d'appeler Intent.createChooser(), puis ajoutez un 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. Assurez-vous de donner Sharesheet les autorisations appropriées pour lire n’importe quelle image que vous souhaitez utiliser comme miniature. Pour plus d'informations, voir 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 Sharesheet

Capture d'écran des actions personnalisées sur Android Sharesheet.

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

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

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

Android Sharesheet vous permet de spécifier jusqu'à deux objets ChooserTarget qui s'affichent avant que les raccourcis de partage et les cibles du sélecteur ne soient chargés depuis ChooserTargetServices. Vous pouvez également spécifier jusqu'à deux intents pointant vers des activités listées avant les suggestions d'applications:

Ajouter Intent.EXTRA_CHOOSER_TARGETS et Intent.EXTRA_INITIAL_INTENTS à votre intent de partage après avoir appelé 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 précaution. Chaque Intent personnalisé et ChooserTarget que vous ajoutez réduisent le nombre suggéré par le système. Nous avons généralement et déconseillés d'ajouter des cibles personnalisées. Un exemple courant approprié d'ajout Intent.EXTRA_INITIAL_INTENTS permet de fournir des actions supplémentaires que les utilisateurs peuvent effectuer sur les contenus. Par exemple, un utilisateur partage des images et Intent.EXTRA_INITIAL_INTENTS permet de laissez-les envoyer un lien à la place. Exemple courant d'ajout de Intent.EXTRA_CHOOSER_TARGETS consiste à mettre en avant les utilisateurs ou les appareils pertinents proposés par votre application.

Exclure des cibles spécifiques par composant

Vous pouvez exclure des cibles spécifiques en indiquant Intent.EXTRA_EXCLUDE_COMPONENTS. Ne le faites que pour supprimer des cibles que vous contrôlez. Un cas d'utilisation courant consiste à masquer cibles de partage de l'application lorsque les utilisateurs la partagent à partir de celle-ci, car leur intention est susceptible de 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 du contenu et quelle cible ils sélectionnent. La Android Sharesheet vous permet d'obtenir ces informations en fournissant le ComponentName de les cibles sélectionnées par vos utilisateurs à l'aide d'un IntentSender.

Commencez par créer un PendingIntent pour un BroadcastReceiver et fournissez ses 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 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 Sharesheet

Sur Android 14 (niveau d'API 34) ou version ultérieure, les applications peuvent ajouter des actions personnalisées à Android Sharesheet. Créer un ChooserAction par ChooserAction.Builder Vous pouvez spécifier un PendingIntent comme action appelée lorsque l'utilisateur clique sur l'icône. Créer un tableau contenant toutes vos actions personnalisées et le spécifier en tant que EXTRA_CHOOSER_CUSTOM_ACTIONS de la part Intent.

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 lorsque vous envoyez 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 Android Sharesheet. Toutefois, n'appelez pas Intent.createChooser()

Si plusieurs applications installées dont les filtres correspondent ACTION_SEND et le type MIME, le système affiche une boîte de dialogue de sélection d'application appelée résolveur d'intent. qui permet à l'utilisateur de choisir une cible de partage. Si une seule application correspond, il 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'intents.