Android verwendet Intents und zugehörige Extras, damit Nutzer Informationen schnell und einfach über ihre bevorzugten Apps teilen können.
Android bietet Nutzern zwei Möglichkeiten, Daten zwischen Apps zu teilen:
- Das Android-Teilen-Menü ist in erster Linie zum Senden von Inhalten außerhalb Ihrer App und/oder direkt an einen anderen Nutzer gedacht. Beispielsweise können Sie eine URL mit einem Freund teilen.
- Der Android-Intent-Resolver eignet sich am besten für die Weitergabe von Daten an die nächste Phase einer klar definierten Aufgabe. Beispiel: Sie können eine PDF-Datei über Ihre App öffnen und Nutzern die Möglichkeit geben, ihr bevorzugtes Anzeigetool auszuwählen.
Wenn Sie einen Intent erstellen, geben Sie die Aktion an, die er 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 erkennt automatisch die kompatiblen Aktivitäten, die die Daten empfangen können, und zeigt sie dem Nutzer an. Wenn beim Intent-Resolver nur eine Aktivität den Intent verarbeiten kann, wird diese Aktivität sofort gestartet.
Vorteile des Android-Sharesheet
Wir empfehlen Ihnen dringend, das Android-Freigabe-Widget zu verwenden, um für Ihre Nutzer in allen Apps für Einheitlichkeit zu sorgen. Zeigen Sie keine eigene Liste der Freigabeziele Ihrer App an und erstellen Sie keine eigenen Varianten des Freigabebereichs.
Mit Android Sharesheet können Nutzer Informationen mit der richtigen Person teilen und erhalten relevante App-Vorschläge mit nur einem Fingertipp. Das Sharesheet kann Ziele vorschlagen, die für benutzerdefinierte Lösungen nicht verfügbar sind, und ein konsistentes Ranking verwendet. Das liegt daran, dass das Sharesheet Informationen zur App- und Nutzeraktivität berücksichtigen kann, die nur für das System verfügbar sind.
Das Android-Freigabe-Widget bietet außerdem viele praktische Funktionen für Entwickler. Sie haben beispielsweise folgende Möglichkeiten:
- Herausfinden, wann und wo Nutzer Inhalte teilen
- Benutzerdefinierte
ChooserTarget
und App-Ziele hinzufügen - Ab Android 10 (API-Level 29) Vorschau für Rich-Text-Inhalte bereitstellen
- Ziele ausschließen, die mit bestimmten Komponentennamen übereinstimmen
Android-Sharesheet verwenden
Erstellen Sie für alle Arten der Freigabe eine Intent-Aktion und legen Sie als Aktion Intent.ACTION_SEND
fest.
Wenn Sie das Android-Sharesheet aufrufen möchten, rufen Sie Intent.createChooser()
auf und übergeben Sie Ihr Intent
-Objekt.
Es gibt eine Version Ihrer Intent zurück, bei der immer das Android-Freigabe-Sheet angezeigt wird.
Textinhalt senden
Die einfachste und häufigste Verwendung des Android-Freigabe-Sheets 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, wenn Sie einen Artikel oder eine Website per E-Mail oder über soziale Netzwerke mit Freunden teilen möchten. Hier ein Beispiel:
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 Extras hinzufügen, um weitere Informationen anzugeben, z. B. die 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 eine String[]
für Extras wie EXTRA_EMAIL
und EXTRA_CC
. Verwenden Sie putExtra(String, String[])
, um sie der Absicht hinzuzufügen.
Binäre Inhalte senden
Teilen Sie Binärdaten mit der Aktion ACTION_SEND
.
Legen Sie den entsprechenden MIME-Typ fest und platzieren Sie einen URI zu den Daten im zusätzlichen EXTRA_STREAM
, wie im folgenden Beispiel gezeigt.
Dieser Parameter wird häufig zum Teilen von Bildern verwendet, kann aber auch für jede Art von binären Inhalten verwendet werden.
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 für den Zugriff auf die Daten, auf die der Uri
verweist. Dafür gibt es zwei empfohlene Vorgehensweisen:
- Speichern Sie die Daten in Ihrem eigenen
ContentProvider
und achten Sie darauf, dass andere Apps die richtige Berechtigung für den Zugriff auf Ihren Anbieter haben. Der bevorzugte Mechanismus für die Bereitstellung des Zugriffs sind Berechtigungen pro URI. Diese sind temporär und gewähren nur der empfangenden Anwendung Zugriff. Eine einfache Möglichkeit, einContentProvider
wie diese zu erstellen, ist die Verwendung der HilfsklasseFileProvider
. - Verwenden Sie das System
MediaStore
. DasMediaStore
-Objekt ist in erster Linie für Video-, Audio- und Bild-MIME-Typen vorgesehen. Ab Android 3.0 (API-Ebene 11) können jedoch auch andere Datentypen gespeichert werden. Weitere Informationen finden Sie unterMediaStore.Files
. Dateien können mitscanFile()
in dieMediaStore
eingefügt werden. Anschließend wird ein für die Freigabe geeigneterUri
imcontent://
-Format an den angegebenenonScanCompleted()
-Callback übergeben. Hinweis: Sobald die Inhalte dem SystemMediaStore
hinzugefügt wurden, können alle Apps auf dem Gerät darauf zugreifen.
Den richtigen MIME-Typ verwenden
Geben Sie den möglichst spezifischen MIME-Typ an, der für die gesendeten Daten verfügbar ist. Verwenden Sie beispielsweise text/plain
, wenn Sie nur Text teilen möchten. Hier sind einige gängige MIME-Typen für das Senden einfacher Daten unter 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 für MIME-Medientypen.
Je nach angegebenem MIME-Typ wird im Android-Freigabe-Dialogfeld möglicherweise eine Inhaltsvorschau angezeigt. Einige Vorabversionsfunktionen 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 hängt von der Mischung der freigegebenen Inhalte ab. Wenn Sie beispielsweise drei JPEG-Bilder teilen, verwenden Sie den Typ "image/jpg"
. Wenn Sie eine Mischung aus Bildtypen haben, verwenden Sie "image/*"
, um eine Aktivität zu finden, die mit allen Bildtypen funktioniert. Es ist zwar möglich, verschiedene Arten zu teilen, wir raten jedoch dringend davon ab, da der Empfänger nicht weiß, was gesendet werden soll. Wenn mehrere Typen gesendet werden müssen, verwenden Sie "*/*"
. Die empfangende Anwendung muss Ihre Daten parsen und verarbeiten. 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 Empfängeranwendung zugreifen kann.
Textvorschauen mit umfangreichen Inhalten ergänzen
Ab Android 10 (API-Level 29) wird im Android-Freigabebereich eine Vorschau des geteilten Texts angezeigt. In einigen Fällen ist der geteilte Text schwer zu verstehen. Angenommen, Sie möchten eine komplizierte URL wie https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
teilen. Durch eine umfassendere Vorschau können Ihre Nutzer besser nachvollziehen, was geteilt wird.
Wenn Sie eine Textvorschau 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 verwende ClipData
, um ein relevantes Thumbnail hinzuzufügen.
Hinweis: Der URI des Bildinhalts wird von einer FileProvider
bereitgestellt, in der Regel von einer konfigurierten <cache-path>
.
Weitere Informationen finden Sie unter Dateien freigeben. Achten Sie darauf, Sharesheet die richtigen Berechtigungen zum Lesen von Bildern zu 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 Freigabebereich benutzerdefinierte Aktionen hinzufügen
Unter Android 14 (API-Level 34) und höher können Apps dem Android-Teilen-Menü benutzerdefinierte Aktionen hinzufügen.
Die benutzerdefinierten Aktionen werden oben im Android-Freigabe-Sheet als kleine Aktionssymbole angezeigt. Apps können eine beliebige Intent
als Aktion angeben, die beim Klicken auf das Symbol aufgerufen wird.
Wenn Sie dem Android-Freigabe-Menü benutzerdefinierte Aktionen hinzufügen möchten, erstellen Sie zuerst eine ChooserAction
mit ChooserAction.Builder
.
Sie können eine PendingIntent
als Aktion angeben, die beim Klicken auf das Symbol ausgeführt wird. Erstelle ein Array mit allen benutzerdefinierten Aktionen und gib es als EXTRA_CHOOSER_CUSTOM_ACTIONS
der Freigabe 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-Freigabebereich können Sie bis zu zwei ChooserTarget
-Objekte angeben, die angezeigt werden, bevor die Freigabe-Verknüpfungen und Auswahlziele aus ChooserTargetServices
geladen werden. Sie können auch bis zu zwei Intents angeben, die auf Aktivitäten verweisen, die vor den App-Vorschlägen aufgeführt sind:
Fügen Sie dem Intent „Teilen“ Intent.EXTRA_CHOOSER_TARGETS
und Intent.EXTRA_INITIAL_INTENTS
nach dem Aufruf von Intent.createChooser()
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);
Verwenden Sie diese Funktion mit Vorsicht. Mit jeder benutzerdefinierten Intent
und ChooserTarget
, die Sie hinzufügen, reduziert sich die vom System vorgeschlagene Anzahl. Wir raten generell davon ab, benutzerdefinierte Ziele hinzuzufügen. Ein häufiges Beispiel für die Verwendung von Intent.EXTRA_INITIAL_INTENTS
ist die Angabe zusätzlicher Aktionen, die Nutzer auf freigegebene Inhalte ausführen können. Ein Nutzer teilt beispielsweise Bilder und Intent.EXTRA_INITIAL_INTENTS
wird verwendet, um ihm zu ermöglichen, stattdessen einen Link zu senden. Ein gängiges geeignetes Beispiel für das Hinzufügen von Intent.EXTRA_CHOOSER_TARGETS
ist die Anzeige relevanter Personen oder Geräte, die deine App bietet.
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 innerhalb Ihrer App teilen, da sie sie wahrscheinlich außerhalb Ihrer App teilen möchten.
Fügen Sie Ihrem Intent Intent.EXTRA_EXCLUDE_COMPONENTS
hinzu, nachdem Sie Intent.createChooser()
aufgerufen haben:
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 erhalten
Es kann hilfreich sein, zu wissen, wann Ihre Nutzer Inhalte teilen und welches Ziel sie auswählen. Über das Android-Freigabe-Widget können Sie diese Informationen abrufen, indem Sie die ComponentName
der Ziele angeben, die Nutzer über eine IntentSender
auswählen.
Erstellen Sie zuerst ein PendingIntent
für eine BroadcastReceiver
und geben Sie die zugehörigen 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());
Sie erhalten den Rückruf in MyBroadcastReceiver
und sehen sich Intent.EXTRA_CHOSEN_COMPONENT
an:
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 Freigabebereich benutzerdefinierte Aktionen hinzufügen
Auf Geräten mit Android 14 (API-Level 34) und höher können dem Android-Sharesheet benutzerdefinierte Aktionen hinzugefügt werden.
Erstellen Sie einen ChooserAction
mit ChooserAction.Builder
.
Sie können eine PendingIntent
als Aktion angeben, die beim Anklicken des Symbols aufgerufen wird. Erstelle ein Array mit allen benutzerdefinierten Aktionen und gib es als EXTRA_CHOOSER_CUSTOM_ACTIONS
der Freigabe 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, wenn Daten im Rahmen eines klar definierten Aufgabenflusses 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, wie Sie es beim Aufrufen des Android-Sharesheets tun würden. Rufen Sie Intent.createChooser()
jedoch nicht an.
Wenn mehrere installierte Anwendungen mit Filtern installiert sind, die mit ACTION_SEND
und dem MIME-Typ übereinstimmen, wird vom System ein Dialogfeld zur ‑Auflösung namens Intent Resolver angezeigt, 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 für die Verwendung des Android Intent Resolvers zum Senden von Text:
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.