Android bietet Nutzern zwei Möglichkeiten, Daten zwischen Apps zu teilen:
- Das Android-Sharesheet ist in erster Linie dafür gedacht, Inhalte außerhalb deiner App oder direkt an einen anderen Nutzer zu senden. Beispiel: Sie teilen eine URL mit einem Freund.
- Der Android Intent Resolver eignet sich am besten für die Weitergabe von Daten an die nächste Phase einer klar definierten Aufgabe. Beispiel: Eine PDF-Datei wird über deine App geöffnet und Nutzer können ihren bevorzugten Viewer auswählen.
Vorteile des Android-Sharesheets
Verwende das Android-Sharesheet, um für deine Nutzer eine einheitliche Darstellung in allen Apps zu schaffen. Zeige nicht die eigene Liste der Freigabeziele deiner App an und erstelle keine eigenen Varianten des Sharesheets.
Mit dem 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 verwendet ein einheitliches Ranking. Das liegt daran, dass das Sharesheet Informationen zu App- und Nutzeraktivitäten berücksichtigen kann, die nur dem System zur Verfügung stehen.
Das Android-Sharesheet bietet auch viele praktische Funktionen für Entwickler. Sie können beispielsweise Folgendes tun:
- Herausfinden, wann und wo Nutzer Inhalte teilen
- Benutzerdefinierte Ziele und App-Ziele hinzufügen
- Vorschau von RTF-Inhalten ab Android 10 (API-Level 29)
- Ziele ausschließen, die mit bestimmten Komponentennamen übereinstimmen
Android-Sharesheet verwenden
Erstellen Sie für alle Arten der Freigabe einen Intent und legen Sie die Aktion auf Intent.ACTION_SEND fest.
Wenn Sie das Android-Sharesheet anzeigen möchten, rufen Sie Intent.createChooser() auf und übergeben Sie das Intent-Objekt.
Es wird eine Version des Intents zurückgegeben, bei der immer das Android-Sharesheet angezeigt wird.
Textinhalt senden
Die einfachste und gängigste Verwendung des Android-Sharesheets besteht darin, Textinhalte von einer Aktivität an eine andere zu senden. Die meisten Browser können beispielsweise die URL der aktuell angezeigten Seite als Text mit einer anderen App teilen. Das ist nützlich, um einen Artikel oder eine Website per E-Mail oder über soziale Netzwerke mit Freunden zu teilen. Rufen Sie in Jetpack Compose den aktuellen Kontext mit LocalContext.current ab und rufen Sie context.startActivity() auf.
Hier ein Beispiel:
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) }
Optional können Sie Extras hinzufügen, um weitere Informationen anzugeben, z. B. E-Mail-Empfänger (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC) oder den E-Mail-Betreff (EXTRA_SUBJECT).
Hinweis:Einige E‑Mail-Apps wie Gmail erwarten ein String[] für Extras wie EXTRA_EMAIL und EXTRA_CC. Verwenden Sie putExtra(String, String[]), um diese Ihrem Intent hinzuzufügen.
Binäre Inhalte senden
Binärdaten mit der Aktion ACTION_SEND freigeben.
Legen Sie den entsprechenden MIME-Typ fest und fügen Sie einen URI zu den Daten im Extra EXTRA_STREAM ein, wie im folgenden Beispiel gezeigt.
Dies wird häufig zum Teilen von Bildern verwendet, kann aber auch zum Teilen von beliebigen binären Inhalten verwendet werden.
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)) }
Die empfangende Anwendung benötigt die Berechtigung, auf die Daten zuzugreifen, auf die der Uri verweist. Es gibt zwei empfohlene Möglichkeiten:
- Speichern Sie die Daten in Ihrem eigenen
ContentProviderund achten Sie darauf, dass andere Apps die richtige Berechtigung für den Zugriff auf Ihren Anbieter haben. Die bevorzugte Methode für die Bereitstellung des Zugriffs ist die Verwendung von URI-spezifischen Berechtigungen, die temporär sind und nur der empfangenden Anwendung Zugriff gewähren. Verwenden Sie zum Erstellen eines solchenContentProviderdie HilfsklasseFileProvider. - Verwenden Sie das System
MediaStore.MediaStoreist hauptsächlich für Video-, Audio- und Bild-MIME-Typen gedacht. Ab Android 3.0 (API-Level 11) können jedoch auch andere Datentypen gespeichert werden. Weitere Informationen finden Sie unterMediaStore.Files. Dateien können mitscanFile()in dieMediaStoreeingefügt werden. Anschließend wird eineUriimcontent://-Stil, die für die Freigabe geeignet ist, an den bereitgestelltenonScanCompleted()-Callback übergeben. Nachdem die Inhalte dem SystemMediaStorehinzugefügt wurden, sind sie für jede App auf dem Gerät zugänglich.
Richtigen MIME-Typ verwenden
Geben Sie den spezifischsten MIME-Typ an, der für die von Ihnen gesendeten Daten verfügbar ist. Verwenden Sie beispielsweise text/plain, wenn Sie Nur-Text teilen. Hier sind einige gängige MIME-Typen zum Senden von Daten in Android:
| Empfänger registrieren sich für | Absender senden |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| Unterstützte Dateiendungen | application/pdf |
Wenn Sie den MIME-Typ dynamisch zur Laufzeit bestimmen möchten, anstatt ihn hartzucodieren, verwenden Sie die folgenden Methoden:
- Rufen Sie für
content://-URIs (z. B. vonFileProvideroderMediaStore)ContentResolver.getType()auf. - Rufen Sie für Dateiendungen
MimeTypeMap.getSingleton().getMimeTypeFromExtension()auf. - Wenn du das Storage Access Framework verwendest, kannst du auch
DocumentFile.getType()abfragen.
Wenn Sie keinen bestimmten MIME-Typ ermitteln können, verwenden Sie application/octet-stream für allgemeine Binärdaten oder */* als letzte Möglichkeit.
Weitere Informationen zu MIME-Typen finden Sie im offiziellen IANA-Register für MIME-Medientypen.
Je nach angegebenem MIME-Typ wird im Android-Sharesheet möglicherweise eine Inhaltsvorschau angezeigt. Einige Funktionen in der Vorabversion 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 die Inhalte verweisen. Der MIME-Typ variiert je nach Art der Inhalte, die Sie teilen. Wenn Sie beispielsweise drei JPEG-Bilder teilen, verwenden Sie den Typ "image/jpg". Verwenden Sie für eine Mischung aus Bildtypen "image/*", um eine Aktivität abzugleichen, die jeden Bildtyp verarbeitet. Es ist zwar möglich, verschiedene Typen zu teilen, aber das sollten Sie vermeiden, da für den Empfänger unklar ist, was gesendet werden soll. Wenn mehrere Typen gesendet werden müssen, verwenden Sie "*/*". Die empfangende Anwendung muss Ihre Daten parsen und verarbeiten. Beispiel:
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)) }
Achten Sie darauf, dass die bereitgestellten Uri-Objekte auf Daten verweisen, auf die eine empfangende Anwendung zugreifen kann.
Rich Content zu Textvorschauen hinzufügen
Ab Android 10 (API-Level 29) wird im Android-Sharesheet eine Vorschau des geteilten Textes angezeigt. In einigen Fällen kann es schwierig sein, den geteilten Text zu verstehen. Stellen Sie sich vor, Sie möchten eine komplizierte URL wie https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4 teilen. Eine umfassendere Vorschau kann Nutzern zeigen, was genau geteilt wird.
Wenn Sie eine Vorschau von Text anzeigen, 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 ein relevantes Thumbnail hinzu.
Hinweis: Der URI des Bildinhalts wird von einem FileProvider bereitgestellt, in der Regel von einem konfigurierten <cache-path>.
Weitere Informationen finden Sie unter Dateien freigeben. Achte darauf, dass du Sharesheet die richtigen Berechtigungen zum Lesen aller Bilder gibst, die du als Thumbnail verwenden möchtest. Weitere Informationen finden Sie unter Intent.FLAG_GRANT_READ_URI_PERMISSION.
Beispiel:
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) }
Die Vorschau sieht in etwa so aus:

Benutzerdefinierte Aktionen zum Sharesheet hinzufügen
Unter Android 14 (API-Level 34) und höher können Apps dem Android-Sharesheet benutzerdefinierte Aktionen hinzufügen.
Die benutzerdefinierten Aktionen werden als kleine Aktionssymbole oben im Android-Sharesheet angezeigt. Apps können einen beliebigen Intent als Aktion angeben, die beim Klicken auf das Symbol aufgerufen wird.
Wenn Sie dem Android-Sharesheet benutzerdefinierte Aktionen hinzufügen möchten, erstellen Sie zuerst ein ChooserAction mit ChooserAction.Builder.
Sie können eine PendingIntent als Aktion angeben, die aufgerufen wird, wenn auf das Symbol geklickt wird. Erstelle ein Array mit allen benutzerdefinierten Aktionen und gib es als EXTRA_CHOOSER_CUSTOM_ACTIONS der Freigabe-Intent an.
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) }
Benutzerdefinierte Ziele hinzufügen
Im Android-Sharesheet können Sie bis zu zwei benutzerdefinierte Aktivitäts-Intents angeben, die vor den App-Vorschlägen mit Intent.EXTRA_INITIAL_INTENTS aufgeführt werden.
Veröffentliche für „Direct Share“-Ziele (z. B. Unterhaltungen oder Kontakte) stattdessen dynamische Verknüpfungen mit ShortcutManagerCompat (siehe „Direct Share“-Ziele bereitstellen):
Fügen Sie Intent.EXTRA_INITIAL_INTENTS nach dem Aufruf von Intent.createChooser() zu Ihrem Freigabe-Intent hinzu:
val sendIntent = Intent(ACTION_SEND).apply { type = "text/plain" putExtra(Intent.EXTRA_TEXT, previewText) } val customIntent = Intent().apply { component = ComponentName(context.packageName, "${context.packageName}.CustomActivity") } val shareIntent = Intent.createChooser(sendIntent, null).apply { putExtra( Intent.EXTRA_INITIAL_INTENTS, arrayOf(customIntent) ) } context.startActivity(shareIntent)
Verwenden Sie diese Funktion mit Bedacht. Jedes benutzerdefinierte Intent, das Sie hinzufügen, verringert die Anzahl der vom System vorgeschlagenen Elemente. Im Allgemeinen sollten Sie keine benutzerdefinierten Ziele hinzufügen. Ein häufiges Beispiel für das Hinzufügen von Intent.EXTRA_INITIAL_INTENTS ist das Bereitstellen zusätzlicher Aktionen, die Nutzer für geteilte Inhalte ausführen können. Beispiel: Ein Nutzer teilt Bilder und Intent.EXTRA_INITIAL_INTENTS wird verwendet, um ihm stattdessen das Senden eines Links zu ermöglichen.
Bestimmte Ziele nach Komponente ausschließen
Sie können bestimmte Ziele ausschließen, indem Sie Intent.EXTRA_EXCLUDE_COMPONENTS angeben.
Entfernen Sie nur Ziele, über die Sie die Kontrolle haben. Ein häufiger Anwendungsfall ist das Ausblenden der Freigabeziele Ihrer App, wenn Nutzer Inhalte aus Ihrer App heraus teilen, da sie wahrscheinlich außerhalb Ihrer App teilen möchten.
Fügen Sie Ihrem Intent nach dem Aufruf von Intent.createChooser() Intent.EXTRA_EXCLUDE_COMPONENTS hinzu:
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) }
Informationen zur Freigabe abrufen
Es kann nützlich sein, zu wissen, wann Ihre Nutzer Inhalte teilen und welches Ziel sie auswählen. Mit dem Android-Sharesheet kannst du diese Informationen abrufen, indem du die ComponentName der Ziele angibst, die deine Nutzer mit einem IntentSender auswählen.
Erstellen Sie zuerst ein PendingIntent-Objekt für ein BroadcastReceiver-Objekt und geben Sie die IntentSender in Intent.createChooser() an:
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) }
Empfangen Sie den Callback in MyBroadcastReceiver und sehen Sie sich Intent.EXTRA_CHOOSER_RESULT an:
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") }
Weitere Informationen finden Sie im Beispiel für die Plattformfreigabe.
Android Intent Resolver verwenden
ACTION_SEND.Der Android Intent Resolver eignet sich am besten, wenn Daten im Rahmen eines klar definierten Aufgabenablaufs an eine andere App gesendet werden.
Wenn Sie den Android-Intent-Resolver verwenden möchten, erstellen Sie einen Intent und fügen Sie Extras hinzu, so wie Sie es auch beim Aufrufen des Android-Sharesheets tun würden. Rufen Sie jedoch nicht Intent.createChooser() auf.
Wenn mehrere installierte Anwendungen mit Filtern vorhanden sind, die mit ACTION_SEND und dem MIME-Typ übereinstimmen, wird im System ein Dialogfeld zur Mehrdeutigkeitsauflösung angezeigt, das als Intent-Resolver bezeichnet wird. Damit kann der Nutzer ein Ziel zum Teilen auswählen. Wenn nur eine Anwendung übereinstimmt, wird sie ausgeführt.
Hier ein Beispiel für die Verwendung des Android-Intent-Resolvers zum Senden von Text:
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) }
Weitere Informationen
Weitere Informationen zum Senden von Daten finden Sie unter Intents und Intent-Filter.