Android verwendet Intents und die zugehörigen Extras, damit Nutzer Informationen schnell und einfach über ihre Lieblings-Apps teilen können.
Android bietet Nutzern zwei Möglichkeiten, Daten zwischen Apps zu teilen:
- Das Android-Sharesheet ist in erster Linie zum Senden von Inhalten außerhalb deiner App und/oder direkt an einen anderen Nutzer gedacht. Zum Beispiel, wenn Sie eine URL mit einem Freund teilen.
- Der Android-Intent-Resolver eignet sich am besten für die Übergabe von Daten an die nächste Phase einer klar definierten Aufgabe. Beispielsweise kannst du ein PDF aus deiner App öffnen und es Nutzern ermöglichen, 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, sogar über Prozessgrenzen hinweg. Sie müssen die Daten
und ihren Typ angeben. Das System identifiziert automatisch die kompatiblen Aktivitäten, mit denen die Daten empfangen werden 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 dir dringend, das Android-Sharesheet zu verwenden, um für Konsistenz für deine Nutzer in allen Apps zu sorgen. Verwenden Sie nicht die eigene Liste von Freigabezielen Ihrer App und erstellen Sie keine eigenen Sharesheet-Varianten.
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-Sharesheet bietet auch viele praktische Funktionen für Entwickler. Sie haben beispielsweise folgende Möglichkeiten:
- Herausfinden, wann und wo Nutzer etwas geteilt haben
- Benutzerdefinierte
ChooserTarget
und App-Ziele hinzufügen - Vorschau auf Rich-Text-Inhalte ab Android 10 (API-Level 29) bereitstellen
- Ziele ausschließen, die mit bestimmten Komponentennamen übereinstimmen
Android-Sharesheet verwenden
Erstellen Sie für alle Freigabetypen einen Intent und legen Sie seine Aktion auf Intent.ACTION_SEND
fest.
Wenn du das Android-Sharesheet aufrufen möchtest, rufe Intent.createChooser()
auf und übergib dein Intent
-Objekt.
Er gibt eine Version deines 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 an eine andere App weitergeben. Dies ist nützlich, um einen Artikel oder eine Website per E-Mail oder über soziale Netzwerke mit Freunden zu teilen. 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 zusätzliche Informationen hinzufügen, z. B. die E-Mail-Empfänger (EXTRA_EMAIL
, EXTRA_CC
, EXTRA_BCC
) oder den E-Mail-Betreff (EXTRA_SUBJECT
).
Hinweis:In einigen E-Mail-Apps wie Gmail wird eine String[]
für Extras wie EXTRA_EMAIL
und EXTRA_CC
erwartet. Verwenden Sie putExtra(String, String[])
, um diese dem Intent 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.
Dies wird üblicherweise verwendet, um ein Bild zu teilen, kann aber auch für beliebige Arten von binären Inhalten genutzt 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 Anwendungen die entsprechende Berechtigung für den Zugriff auf Ihren Anbieter haben. Der bevorzugte Mechanismus für die Bereitstellung des Zugriffs besteht darin, Berechtigungen pro URI zu verwenden. 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
. - Verwende 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 aber auch Nicht-Medientypen gespeichert werden. Weitere Informationen finden Sie unterMediaStore.Files
. Dateien können mithilfe vonscanFile()
in dieMediaStore
eingefügt werden. Danach wird einUri
-Element imcontent://
-Stil, das für die Freigabe geeignet ist, an den bereitgestelltenonScanCompleted()
-Callback übergeben. Beachten Sie, dass der Inhalt nach dem Hinzufügen zumMediaStore
des Systems für jede App auf dem Gerät zugänglich ist.
Den richtigen MIME-Typ verwenden
Geben Sie den spezifischsten MIME-Typ für die von Ihnen gesendeten Daten an. Verwenden Sie beispielsweise text/plain
, wenn Sie Nur-Text freigeben. Hier sind einige gängige MIME-Typen für das 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 für MIME-Medientypen.
Je nach angegebenem MIME-Typ wird auf dem Android-Sharesheet möglicherweise eine Inhaltsvorschau angezeigt. Einige Vorschaufeatures 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"
. Verwenden Sie "image/*"
für eine Mischung aus Image-Typen, um eine Aktivität abzugleichen, die einen beliebigen Image-Typ verarbeitet. Es ist zwar möglich, eine Mischung aus verschiedenen Typen zu teilen, wir raten jedoch dringend 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 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 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 geteilter Text schwer verständlich sein. Sie können auch eine komplizierte URL wie https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
verwenden. Durch eine umfassendere Vorschau können Ihre Nutzer besser nachvollziehen, was geteilt wird.
Für die Vorschau von Text können Sie einen Titel, ein Thumbnail oder beides festlegen. Fügen Sie Intent.EXTRA_TITLE
eine Beschreibung hinzu, bevor Sie Intent.createChooser()
aufrufen, und fügen Sie mit ClipData
eine relevante Miniaturansicht hinzu.
Hinweis:Der Image-Inhalts-URI wird über eine 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 jedes Bildes gibst, das du als Thumbnail verwenden möchtest. 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
Auf Geräten mit Android 14 (API-Level 34) und höher können dem Android-Sharesheet benutzerdefinierte Aktionen hinzugefügt werden.
Die benutzerdefinierten Aktionen werden als kleine Aktionssymbole oben im Android-Sharesheet angezeigt und in Apps kann eine beliebige Intent
als Aktion angegeben werden, die beim Anklicken des Symbols aufgerufen wird.
Wenn du dem Android-Sharesheet benutzerdefinierte Aktionen hinzufügen möchtest, erstelle zuerst ein ChooserAction
mit ChooserAction.Builder
.
Sie können eine PendingIntent
als Aktion angeben, die beim Anklicken des Symbols aufgerufen wird. Erstellen Sie ein Array, das alle Ihre benutzerdefinierten Aktionen enthält, und geben Sie es als EXTRA_CHOOSER_CUSTOM_ACTIONS
des 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 angezeigt werden, bevor die Verknüpfungen und Auswahlziele für die Freigabe aus ChooserTargetServices
geladen 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 Intent.EXTRA_CHOOSER_TARGETS
und Intent.EXTRA_INITIAL_INTENTS
hinzu, nachdem Sie Intent.createChooser()
aufgerufen haben:
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. In der Regel raten wir 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. Beispiel: Ein Nutzer teilt Bilder und Intent.EXTRA_INITIAL_INTENTS
wird verwendet, damit er stattdessen einen Link senden kann. 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 so nur Ziele, über die Sie die Kontrolle haben. Ein häufiger Anwendungsfall besteht darin, die Freigabeziele Ihrer App auszublenden, wenn Nutzer Inhalte innerhalb Ihrer App teilen, da sie diese wahrscheinlich außerhalb der App teilen.
Fügen Sie dem 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 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 mit einem 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());
Du erhältst 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
Auf Geräten mit Android 14 (API-Level 34) und höher können dem Android-Sharesheet benutzerdefinierte Aktionen hinzugefügt werden.
Erstellen Sie ein ChooserAction
mit ChooserAction.Builder
.
Sie können eine PendingIntent
als Aktion angeben, die beim Anklicken des Symbols aufgerufen wird. Erstellen Sie ein Array, das alle Ihre benutzerdefinierten Aktionen enthält, und geben Sie es als EXTRA_CHOOSER_CUSTOM_ACTIONS
des 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 Intent-Resolver von Android wird am besten verwendet, wenn Daten im Rahmen eines klar definierten Aufgabenablaufs an eine andere App gesendet werden.
Um den Android-Intent-Resolver zu verwenden, erstellen Sie einen Intent und fügen Sie Extras hinzu, wie Sie das Android-Sharesheet nennen würden. Rufen Sie Intent.createChooser()
jedoch nicht auf.
Wenn es mehrere installierte Anwendungen mit Filtern gibt, die ACTION_SEND
und dem MIME-Typ entsprechen, wird vom System ein Dialogfenster mit dem Namen Intent-Resolver angezeigt, über das der Nutzer ein Ziel für die Freigabe auswählen kann. Wenn eine einzelne Anwendung übereinstimmt, wird sie ausgeführt.
Hier ist 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.