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:
- Herausfinden, wann Nutzer Inhalte teilen und wo
- Benutzerdefinierte
ChooserTarget
und App-Ziele hinzufügen - Vorschau für Rich-Text-Inhalte ab Android 10 (API-Level 29)
- Ziele ausschließen, die mit bestimmten Komponentennamen übereinstimmen
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, einContentProvider
wie dieses zu erstellen, ist die Verwendung der HilfsklasseFileProvider
. - Verwenden Sie das System-
MediaStore
. DerMediaStore
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 unterMediaStore.Files
. Dateien können mitscanFile()
in dieMediaStore
eingefügt werden. Anschließend wird einUri
-Objekt imcontent://
-Stil, das zur Freigabe geeignet ist, an den bereitgestelltenonScanCompleted()
-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/* |
|
`image/*` |
|
video/* |
|
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
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
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.