Android verwendet Intents und die zugehörigen Extras, damit Nutzer Informationen schnell über ihre bevorzugten Apps teilen können.
Android bietet Nutzern zwei Möglichkeiten, Daten zwischen Apps zu teilen:
- Das Android-Freigabeblatt ist in erster Linie für das Senden von Inhalten außerhalb Ihrer App und/oder direkt an einen anderen Nutzer konzipiert. Beispiel: Freigabe einer URL für einen Freund.
- Der Android-Intent-Resolver eignet sich am besten für die Übergabe von Daten an die nächste Phase einer genau definierten Aufgabe. Beispiel: Öffnen einer PDF-Datei aus Ihrer App und Auswahl des bevorzugten Viewers durch den Nutzer.
Wenn Sie ein Intent erstellen, geben Sie die Aktion an, die das 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 ermittelt automatisch die kompatiblen Aktivitäten, die die Daten empfangen können, und zeigt sie dem Nutzer an. Im Fall des Intent-Resolvers wird diese Aktivität sofort gestartet, wenn nur eine Aktivität das Intent verarbeiten kann.
Warum das Android-Freigabeblatt verwenden?
Wir empfehlen dringend, das Android-Freigabeblatt zu verwenden, um eine einheitliche Nutzererfahrung in allen Apps zu schaffen. Zeigen Sie nicht die eigene Liste der Freigabeziele Ihrer App an und erstellen Sie keine eigenen Freigabeblatt-Variationen.
Mit dem Android-Freigabeblatt können Nutzer Informationen mit einem einzigen Tippen an die richtige Person senden. Dabei werden relevante App-Vorschläge angezeigt. Das Freigabeblatt kann Ziele vorschlagen, die für benutzerdefinierte Lösungen nicht verfügbar sind, und verwendet eine einheitliche Rangfolge. Das liegt daran, dass das Freigabeblatt Informationen zu App- und Nutzeraktivitäten berücksichtigen kann, die nur dem System zur Verfügung stehen.
Das Android-Freigabeblatt bietet auch viele praktische Funktionen für Entwickler. Beispielsweise können Sie Folgendes tun:
- Herausfinden, wann und wohin Ihre Nutzer Inhalte freigeben
- Benutzerdefinierte
ChooserTarget- und App-Ziele hinzufügen - Vorschau von RTF-Inhalten ab Android 10 (API-Level 29)
- Ziele ausschließen, die bestimmten Komponentennamen entsprechen
Android-Freigabeblatt verwenden
Erstellen Sie für alle Arten der Freigabe ein Intent und legen Sie die Aktion auf Intent.ACTION_SEND fest.
Rufen Sie
Intent.createChooser(), auf und übergeben Sie das Intent Objekt, um das Android-Freigabeblatt anzuzeigen.
Es wird eine Version Ihres Intents zurückgegeben, in der immer das Android-Freigabeblatt angezeigt wird.
Textinhalte senden
Die einfachste und häufigste Verwendung des Android-Freigabeblatts 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 senden. Das ist nützlich, um einen Artikel oder eine Website per E-Mail oder über soziale Netzwerke mit Freunden zu teilen. 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 wie E-Mail-Empfänger (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC), den E-Mail-Betreff (EXTRA_SUBJECT) usw. einzufügen.
Hinweis:Einige E-Mail-Apps wie Gmail erwarten für Extras wie EXTRA_EMAIL und EXTRA_CC ein String[]. Verwenden Sie putExtra(String, String[]), um diese Ihrem Intent hinzuzufügen.
Binäre Inhalte senden
Teilen Sie binäre Daten mit der Aktion ACTION_SEND.
Legen Sie den entsprechenden MIME-Typ fest und platzieren Sie einen URI zu den Daten im Extra EXTRA_STREAM, wie im folgenden Beispiel gezeigt.
Dies wird häufig verwendet, um Bilder zu teilen, kann aber auch für alle Arten von 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 sorgen Sie dafür, 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, die temporär sind und nur der empfangenden Anwendung Zugriff gewähren. Eine Möglichkeit, einen solchenContentProviderzu erstellen, ist die Verwendung der HilfsklasseFileProvider. - Verwenden Sie den System-
MediaStore. DerMediaStoreist in erster Linie für Video-, Audio- und Bild-MIME-Typen vorgesehen. Ab Android 3.0 (API-Level 11) können jedoch auch andere Typen gespeichert werden. Weitere Informationen finden Sie unterMediaStore.Files. Dateien können mitscanFile()in denMediaStoreeingefügt werden. Anschließend wird eincontent://-ähnlicherUriübergeben, der für die Freigabe geeignet ist, an den bereitgestelltenonScanCompleted()-Callback. Hinweis: Sobald die Inhalte dem System-MediaStorehinzugefügt wurden, sind sie für alle Apps auf dem Gerät zugänglich.
Richtigen MIME-Typ verwenden
Geben Sie den spezifischsten MIME-Typ an, der für die Daten verfügbar ist, die Sie senden. Verwenden Sie beispielsweise text/plain, wenn Sie Nur-Text freigeben. Hier sind einige gängige MIME-Typen für das Senden von 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 im IANA offiziellen Register der MIME-Medientypen.
Je nach angegebenem MIME-Typ wird im Android-Freigabeblatt möglicherweise eine Vorschau des Inhalts angezeigt. Einige Vorschaufunktionen sind nur für bestimmte Typen verfügbar.
Mehrere Inhalte freigeben
Verwenden Sie die Aktion ACTION_SEND_MULTIPLE zusammen mit einer Liste von URIs, die auf die Inhalte verweisen, um mehrere Inhalte freizugeben. Der MIME-Typ variiert je nach Art der freigegebenen Inhalte. Wenn Sie beispielsweise drei JPEG-Bilder freigeben, verwenden Sie den Typ "image/jpg". Verwenden Sie bei einer Mischung aus Bildtypen "image/*", um eine Aktivität zu finden, die alle Arten von Bildern verarbeiten kann. Es ist zwar möglich, eine Mischung aus Typen freizugeben, wir raten jedoch dringend davon ab, da der Empfänger nicht weiß, was gesendet werden soll. Wenn Sie mehrere Typen senden müssen, verwenden Sie "*/*". Es liegt an der empfangenden Anwendung, Ihre Daten zu parsen und zu 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 angegebenen 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-Freigabeblatt eine Vorschau des freigegebenen Texts angezeigt. In einigen Fällen ist der freigegebene Text möglicherweise schwer zu verstehen. Beispiel: Freigabe einer komplizierten URL wie https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4. Eine aussagekräftigere Vorschau kann Nutzern helfen, zu verstehen, was freigegeben wird.
Wenn Sie eine Vorschau des Texts anzeigen, können Sie einen Titel, ein Vorschaubild oder beides festlegen. Fügen Sie Intent.EXTRA_TITLE eine Beschreibung hinzu, bevor Sie Intent.createChooser() aufrufen, und fügen Sie mit ClipData ein relevantes Vorschaubild hinzu.
Hinweis: Der URI des Bildinhalts wird von einem
FileProvider, in der Regel aus einem konfigurierten <cache-path> bereitgestellt.
Weitere Informationen finden Sie unter Dateien freigeben. Geben Sie dem Freigabeblatt die richtigen Berechtigungen, um alle Bilder zu lesen, die Sie als Vorschaubild verwenden möchten. 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 Freigabeblatt hinzufügen
Screenshot von benutzerdefinierten Aktionen im Android-Freigabeblatt.
Ab Android 14 (API-Level 34) können Apps benutzerdefinierte Aktionen zum Android-Freigabeblatt hinzufügen.
Die benutzerdefinierten Aktionen werden als kleine Aktionssymbole oben im Android-Freigabeblatt angezeigt. Apps können ein beliebiges Intent als Aktion angeben, die beim Klicken auf das Symbol aufgerufen wird.
Erstellen Sie zuerst eine
ChooserAction
mit
ChooserAction.Builder, um benutzerdefinierte Aktionen im Android-Freigabeblatt hinzuzufügen.
Sie können ein PendingIntent als Aktion angeben, die beim Klicken auf das Symbol aufgerufen wird. Erstellen Sie ein Array mit allen benutzerdefinierten Aktionen und geben Sie es als EXTRA_CHOOSER_CUSTOM_ACTIONS des 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
Mit dem Android-Freigabeblatt können Sie bis zu zwei ChooserTarget-Objekte angeben, die
vor den Freigabe-Shortcuts und den aus ChooserTargetServices geladenen Zielen angezeigt 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 Ihrem Freigabe-Intent Intent.EXTRA_CHOOSER_TARGETS und Intent.EXTRA_INITIAL_INTENTS hinzu, nachdem Sie Intent.createChooser() aufgerufen haben:
val share = Intent.createChooser(shareIntent, null).apply { putExtra( Intent.EXTRA_CHOOSER_TARGETS, arrayOf(chooserTargetJessica, chooserTargetSpyros) ) putExtra( Intent.EXTRA_INITIAL_INTENTS, arrayOf(intentTargetNearbyShare, intentTargetMaps) ) }
Verwenden Sie diese Funktion mit Bedacht. Jedes benutzerdefinierte Intent und ChooserTarget, das Sie hinzufügen, reduziert die Anzahl der vom System vorgeschlagenen Elemente. Wir raten im Allgemeinen davon ab, benutzerdefinierte Ziele hinzuzufügen. Ein häufiges 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 gibt Bilder frei und Intent.EXTRA_INITIAL_INTENTS wird verwendet, damit er stattdessen einen Link senden kann. Ein häufiges Beispiel für das Hinzufügen von Intent.EXTRA_CHOOSER_TARGETS ist das Anzeigen relevanter Personen oder Geräte, die Ihre 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, um Ziele zu entfernen, über die Sie die Kontrolle haben. Ein häufiger Anwendungsfall ist das Ausblenden der Freigabeziele Ihrer App, wenn Nutzer Inhalte aus Ihrer App freigeben, da sie wahrscheinlich Inhalte außerhalb Ihrer App freigeben möchten.
Fügen Sie Ihrem Intent Intent.EXTRA_EXCLUDE_COMPONENTS hinzu, nachdem Sie Intent.createChooser() aufgerufen haben:
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 freigeben und welches Ziel sie auswählen. Mit dem Android-Freigabeblatt können Sie diese Informationen abrufen, indem Sie den ComponentName der Ziele angeben, die Ihre Nutzer mit einem IntentSender auswählen.
Erstellen Sie zuerst ein PendingIntent für einen BroadcastReceiver und geben Sie den 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 suchen Sie in Intent.EXTRA_CHOOSER_RESULT:
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") }
Benutzerdefinierte Aktionen zum Freigabeblatt hinzufügen
Ab Android 14 (API-Level 34) können Apps benutzerdefinierte Aktionen zum Android-Freigabeblatt hinzufügen.
Erstellen Sie eine ChooserAction
mit
ChooserAction.Builder.
Sie können ein PendingIntent als Aktion angeben, die beim Klicken auf das Symbol aufgerufen wird. Erstellen Sie ein Array mit allen benutzerdefinierten Aktionen und geben Sie es als EXTRA_CHOOSER_CUSTOM_ACTIONS des Freigabe-Intent an.
fun customActions(context: Context, text: String) { val sendIntent = 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_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) }
Android-Intent-Resolver verwenden
Screenshot des ACTION_SEND-Intent-Resolvers.
Der Android-Intent-Resolver eignet sich am besten, wenn Daten im Rahmen eines genau definierten Aufgabenablaufs an eine andere App gesendet werden.
Erstellen Sie ein Intent und fügen Sie Extras hinzu, wie Sie es tun würden, um das Android-Freigabeblatt aufzurufen, um den Android-Intent-Resolver zu verwenden. Rufen Sie jedoch nicht auf
Intent.createChooser().
Wenn mehrere installierte Anwendungen mit Filtern vorhanden sind, die mit ACTION_SEND und dem MIME-Typ übereinstimmen, zeigt das System ein Dialogfeld zur Auswahl an, das als Intent-Resolver bezeichnet wird. Dort kann der Nutzer ein Ziel für die Freigabe 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.