Einfache Daten an andere Apps senden

Android verwendet Intents und die damit verbundenen Extras, damit Nutzer über ihre bevorzugten Apps schnell und einfach Informationen teilen können.

Android bietet Nutzern zwei Möglichkeiten, Daten zwischen Apps zu teilen:

  • Das Android-Sharesheet ist in erster Linie dazu gedacht, Inhalte außerhalb deiner App und/oder direkt an andere Nutzer zu senden. Zum Beispiel das Teilen einer URL mit einem Freund.
  • Der Intent-Resolver von Android eignet sich am besten, um Daten an die nächste Phase einer klar definierten Aufgabe zu übergeben. Du kannst beispielsweise ein PDF in deiner App öffnen und Nutzern die Möglichkeit geben, ihren bevorzugten Viewer auszuwählen.

Wenn Sie einen Intent erstellen, geben Sie die Aktion an, die der Intent ausführen soll. Android verwendet die Aktion ACTION_SEND, um Daten von einer Aktivität an eine andere zu senden, auch über Prozessgrenzen hinweg. Sie müssen die Daten und ihren Typ angeben. Das System identifiziert automatisch die kompatiblen Aktivitäten, die die Daten empfangen können, und zeigt sie dem Nutzer an. Im Fall des Intent-Resolvers beginnt diese Aktivität sofort, wenn nur eine Aktivität den Intent verarbeiten kann.

Vorteile des Android-Sharesheet

Wir empfehlen dringend, das Android-Sharesheet zu verwenden, um in allen Apps für Einheitlichkeit zu sorgen. Blende nicht die eigene Liste von Freigabezielen deiner App ein und erstelle keine eigenen Sharesheet-Varianten.

Mit Android Sharesheet können Nutzer Informationen mit der richtigen Person teilen und relevante App-Vorschläge erhalten – alles mit nur einem Tippen. Das Sharesheet kann Ziele vorschlagen, die für benutzerdefinierte Lösungen nicht verfügbar sind, und ein einheitliches Ranking verwendet. Das liegt daran, dass das Sharesheet Informationen zur App- und Nutzeraktivität berücksichtigen kann, die nur dem System zur Verfügung stehen.

Das Android Sharesheet enthält außerdem viele praktische Funktionen für Entwickler. Sie können beispielsweise Folgendes tun:

Android Sharesheet verwenden

Für alle Arten der Freigabe erstellen Sie einen Intent und legen seine Aktion auf Intent.ACTION_SEND fest. Wenn Sie das Android-Sharesheet aufrufen möchten, rufen Sie Intent.createChooser() auf und übergeben Sie Ihr Intent-Objekt. Sie gibt eine Version Ihres Intents zurück, in der immer das Android-Sharesheet angezeigt wird.

Textinhalt senden

Die einfachste und häufigste Verwendung des Android-Sharesheet ist das Senden von Textinhalten von einer Aktivität an eine andere. Die meisten Browser können beispielsweise die URL der aktuell angezeigten Seite als Text mit einer anderen Anwendung teilen. Dies ist nützlich, um einen Artikel oder eine Website über E-Mail oder soziale Netzwerke mit Freunden zu teilen. Hier ist ein Beispiel dafür:

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);

Optional können Sie zusätzliche Informationen hinzufügen, z. B. die E-Mail-Empfänger (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC), den E-Mail-Betreff (EXTRA_SUBJECT) usw.

Hinweis: Bei einigen E-Mail-Apps wie Gmail ist für Extras wie EXTRA_EMAIL und EXTRA_CC ein String[] erwartet. Verwenden Sie putExtra(String, String[]), um diese Ihrem Intent hinzuzufügen.

Binären Inhalt senden

Geben Sie Binärdaten mit der Aktion ACTION_SEND frei. Legen Sie den entsprechenden MIME-Typ fest und fügen Sie den Daten im zusätzlichen EXTRA_STREAM einen URI ein, wie im folgenden Beispiel gezeigt. Dies wird üblicherweise verwendet, um ein Bild zu teilen, kann aber verwendet werden, um jede Art von binären Inhalten zu teilen.

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));

Die empfangende Anwendung benötigt die Berechtigung, auf die Daten zuzugreifen, auf die Uri verweist. Dafür gibt es zwei empfohlene Methoden:

  • Speichern Sie die Daten in Ihrem eigenen ContentProvider und achten Sie darauf, dass andere Apps die entsprechende Berechtigung für den Zugriff auf Ihren Anbieter haben. Wir empfehlen, Berechtigungen pro URI zu verwenden. Diese sind temporär und gewähren nur der empfangenden Anwendung Zugriff. Eine einfache Möglichkeit, ein ContentProvider wie dieses zu erstellen, ist die Verwendung der Hilfsklasse FileProvider.
  • Verwenden Sie das System-MediaStore. Der MediaStore ist in erster Linie für Video-, Audio- und Bild-MIME-Typen vorgesehen. Ab Android 3.0 (API-Ebene 11) können jedoch auch Nicht-Medientypen gespeichert werden. Weitere Informationen finden Sie unter MediaStore.Files. Dateien können mit scanFile() in die MediaStore eingefügt werden. Anschließend wird ein Uri-Objekt im content://-Stil, das zur Freigabe geeignet ist, an den bereitgestellten onScanCompleted()-Callback übergeben. Nachdem sie dem System-MediaStore hinzugefügt wurden, sind die Inhalte für jede App auf dem Gerät zugänglich.

Verwenden Sie den richtigen MIME-Typ

Geben Sie den spezifischsten MIME-Typ an, der für die zu sendenden Daten verfügbar ist. Verwenden Sie beispielsweise text/plain, wenn Sie nur Text freigeben. Hier sind einige gängige MIME-Typen beim Senden einfacher Daten in Android:

Empfänger registrieren sich für Absender senden
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Unterstützte Dateiendungen application/pdf

Weitere Informationen zu MIME-Typen finden Sie in der offiziellen IANA-Registry der MIME-Medientypen.

Je nach angegebenem MIME-Typ wird auf dem Android-Sharesheet möglicherweise eine Inhaltsvorschau angezeigt. Einige Vorschaufunktionen sind nur für bestimmte Typen verfügbar.

Mehrere Inhalte teilen

Wenn Sie mehrere Inhalte freigeben möchten, verwenden Sie die Aktion ACTION_SEND_MULTIPLE zusammen mit einer Liste von URIs, die auf den Inhalt verweisen. Der MIME-Typ variiert je nach der Mischung der freigegebenen Inhalte. Wenn Sie beispielsweise drei JPEG-Bilder teilen, verwenden Sie den Typ "image/jpg". Für eine Kombination aus Bildtypen verwenden Sie "image/*", um einer Aktivität zuzuordnen, die einen beliebigen Bildtyp verarbeitet. Es ist zwar möglich, verschiedene Typen gemeinsam zu verwenden, wir raten jedoch ausdrücklich davon ab, da für den Empfänger nicht klar ist, was gesendet werden soll. Wenn mehrere Typen gesendet werden müssen, verwenden Sie "*/*". Die empfangende Anwendung parst und verarbeitet die Daten. Beispiel:

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));

Die bereitgestellten Uri-Objekte müssen auf Daten verweisen, auf die eine empfangende Anwendung zugreifen kann.

Rich-Content zu Textvorschauen hinzufügen

Ab Android 10 (API-Level 29) wird auf dem Android-Sharesheet eine Vorschau des geteilten Textes angezeigt. Geteilter Text kann manchmal schwer zu verstehen sein. Es kann sinnvoll sein, eine komplizierte URL wie https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4 zu verwenden. In einer ausführlicheren Vorschau sehen die Nutzer besser, was mit ihnen geteilt wird.

Für die Textvorschau können Sie einen Titel, ein Thumbnail oder beides festlegen. Füge Intent.EXTRA_TITLE eine Beschreibung hinzu, bevor du Intent.createChooser() aufrufst, und füge mit ClipData eine relevante Miniaturansicht hinzu.

Hinweis: Der URI des Bildinhalts wird aus einem FileProvider bereitgestellt, in der Regel aus einem konfigurierten <cache-path>. Weitere Informationen finden Sie unter Dateien freigeben. Achten Sie darauf, dass Sie Sharesheet die nötigen Berechtigungen zum Lesen aller Bilder erteilen, die Sie als Thumbnail verwenden möchten. Weitere Informationen finden Sie unter Intent.FLAG_GRANT_READ_URI_PERMISSION.

Beispiel:

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));

Die Vorschau sieht in etwa so aus:

Dem Sharesheet benutzerdefinierte Aktionen hinzufügen

Screenshot von benutzerdefinierten Aktionen auf dem Android-Sharesheet

Unter Android 14 (API-Level 34) und höher können Apps benutzerdefinierte Aktionen zum Android-Sharesheet hinzufügen. Die benutzerdefinierten Aktionen werden oben auf dem Android-Sharesheet als kleine Aktionssymbole angezeigt. Apps können eine beliebige Intent als Aktion angeben, die aufgerufen wird, wenn auf das Symbol geklickt wird.

Wenn Sie dem Android-Sharesheet benutzerdefinierte Aktionen hinzufügen möchten, müssen Sie zuerst ein ChooserAction mit ChooserAction.Builder erstellen. Du kannst eine PendingIntent als Aktion angeben, die aufgerufen wird, wenn auf das Symbol geklickt wird. Erstellen Sie ein Array, das alle Ihre benutzerdefinierten Aktionen enthält, und geben Sie es als EXTRA_CHOOSER_CUSTOM_ACTIONS der gemeinsamen Intent an.

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);

Benutzerdefinierte Ziele hinzufügen

Im Android-Sharesheet kannst du bis zu zwei ChooserTarget-Objekte angeben, die vor den aus ChooserTargetServices geladenen Verknüpfungen zum Teilen und Auswahlzielen angezeigt werden. Sie können auch bis zu zwei Intents angeben, die auf Aktivitäten verweisen, die vor den Anwendungsvorschlägen aufgeführt sind:

Fügen Sie Ihrem Freigabe-Intent nach dem Aufrufen von Intent.createChooser() Intent.EXTRA_CHOOSER_TARGETS und Intent.EXTRA_INITIAL_INTENTS hinzu:

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);

Verwende diese Funktion mit Vorsicht. Mit jedem benutzerdefinierten Intent und ChooserTarget, den Sie hinzufügen, verringert sich die vom System vorgeschlagene Anzahl. Wir raten generell davon ab, benutzerdefinierte Ziele hinzuzufügen. Ein gängiges Beispiel für das Hinzufügen von Intent.EXTRA_INITIAL_INTENTS ist die Bereitstellung zusätzlicher Aktionen, die Nutzer für freigegebene Inhalte ausführen können. Wenn ein Nutzer beispielsweise Bilder teilt, kann er mit Intent.EXTRA_INITIAL_INTENTS stattdessen einen Link senden. Ein gängiges geeignetes Beispiel für das Hinzufügen von Intent.EXTRA_CHOOSER_TARGETS ist, relevante Personen oder Geräte anzuzeigen, die deine App bereitstellt.

Bestimmte Ziele nach Komponente ausschließen

Sie können bestimmte Ziele ausschließen, indem Sie Intent.EXTRA_EXCLUDE_COMPONENTS angeben. Tun Sie dies nur, wenn Sie Ziele entfernen möchten, über die Sie Kontrolle haben. Ein häufiger Anwendungsfall besteht darin, die Freigabeziele Ihrer App auszublenden, wenn Nutzer Inhalte außerhalb Ihrer App teilen.

Fügen Sie Ihrem Intent nach dem Aufruf von Intent.createChooser() Intent.EXTRA_EXCLUDE_COMPONENTS hinzu:

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);

Informationen zur Freigabe

Es kann hilfreich sein zu wissen, wann Ihre Nutzer Daten freigeben und welches Ziel sie auswählen. Im Android-Sharesheet kannst du diese Informationen abrufen, indem du die ComponentName der Ziele angibst, die deine Nutzer mithilfe eines IntentSender auswählen.

Erstellen Sie zuerst eine PendingIntent für eine BroadcastReceiver und geben Sie deren IntentSender in Intent.createChooser() an:

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());

Empfange den Callback in MyBroadcastReceiver und sieh in Intent.EXTRA_CHOSEN_COMPONENT nach:

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);
}

Dem Sharesheet benutzerdefinierte Aktionen hinzufügen

Unter Android 14 (API-Level 34) und höher können Apps benutzerdefinierte Aktionen zum Android-Sharesheet hinzufügen. Erstellen Sie ein ChooserAction mit ChooserAction.Builder. Du kannst eine PendingIntent als Aktion angeben, die aufgerufen wird, wenn auf das Symbol geklickt wird. Erstellen Sie ein Array, das alle Ihre benutzerdefinierten Aktionen enthält, und geben Sie es als EXTRA_CHOOSER_CUSTOM_ACTIONS der gemeinsamen Intent an.

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);

Android-Intent-Resolver verwenden

Screenshot des Intent-Resolvers ACTION_SEND.

Der Android-Intent-Resolver eignet sich am besten für das Senden von Daten an eine andere App im Rahmen eines klar definierten Aufgabenflusses.

Um den Android-Intent-Resolver zu verwenden, erstellen Sie einen Intent und fügen Sie Extras hinzu, wie Sie das Android Sharesheet aufrufen würden. Rufen Sie Intent.createChooser() jedoch nicht auf.

Wenn mehrere Anwendungen mit Filtern installiert sind, die ACTION_SEND und dem MIME-Typ entsprechen, zeigt das System ein Auswahldialogfeld mit dem Namen Intent-Resolver an, in dem der Nutzer ein Ziel für die Freigabe auswählen kann. Wenn eine einzelne Anwendung übereinstimmt, wird sie ausgeführt.

Hier ein Beispiel, wie der Android-Intent-Resolver zum Senden von Text verwendet wird:

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);

Weitere Informationen

Weitere Informationen zum Senden von Daten finden Sie unter Intents und Intent-Filter.