Eine App kann nicht nur Daten an andere Apps senden, sondern auch Daten von anderen Apps empfangen. Überlegen Sie, wie Nutzer mit Ihrer Anwendung interagieren und welche Datentypen Sie von anderen Anwendungen erhalten möchten. Eine Social-Media-App möchte beispielsweise möglicherweise Textinhalte wie eine interessante Web-URL von einer anderen App empfangen.
Nutzer anderer Apps senden häufig Daten über das Android-Sharesheet oder den Intent-Resolver an Ihre App. Apps, die Daten an Ihre App senden, müssen einen MIME-Typ für diese Daten festlegen. Ihre App kann Daten, die von einer anderen App gesendet werden, auf folgende Weise empfangen:
- Ein
Activity
mit einem entsprechendenintent-filter
-Tag im Manifest - Kurzbefehle teilen, die von Ihrer App veröffentlicht wurden.
Direct Share-Ziele sind Deeplinks zu einer bestimmten Aktivität in Ihrer App. Sie stellen häufig eine Person oder eine Gruppe dar und werden im Android-Sharesheet angezeigt. Eine Messaging-App kann beispielsweise ein Direct Share-Ziel für eine Person bereitstellen, das direkt zu einer Unterhaltung mit dieser Person verlinkt. Eine ausführliche Anleitung finden Sie unter Direct Share-Ziele bereitstellen.
Unterstützte MIME-Typen
Im Idealfall sollte eine App eine möglichst große Bandbreite an MIME-Typen empfangen können.
Eine Messaging-App, die zum Senden von Text, Bildern und Videos entwickelt wurde, sollte idealerweise text/*
, image/*
und video/*
empfangen können. Hier sind einige gängige MIME-Typen zum Senden und Empfangen einfacher Daten in Android.
Empfänger registrieren sich für | Absender senden |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Unterstützte Dateiendungen | application/pdf |
Weitere Informationen finden Sie im offiziellen IANA-Register für MIME-Medientypen.
Gute Ziele für das Teilen erstellen
Wenn ein Nutzer auf ein Freigabeziel tippt, das mit einer bestimmten Aktivität verknüpft ist, sollte er die freigegebenen Inhalte bestätigen und bearbeiten können, bevor er sie verwendet. Das ist besonders wichtig für Textdaten.
Daten mit einer Aktivität empfangen
Wenn Sie Daten mit einer Aktivität empfangen, müssen Sie Ihr Manifest aktualisieren, die eingehenden Inhalte verarbeiten und dafür sorgen, dass der Nutzer Ihre App erkennt.
Manifest aktualisieren
Intent-Filter informieren das System darüber, welche Intents eine App-Komponente akzeptiert.
Ähnlich wie beim Erstellen eines Intents mit der Aktion ACTION_SEND
in der Lektion Einfache Daten an andere Apps senden erstellen Sie Intent-Filter, um Intents mit dieser Aktion zu empfangen. Sie definieren einen Intent-Filter in Ihrem Manifest mit dem Element <intent-filter>
.
Wenn Ihre App beispielsweise Textinhalte empfängt, sieht ein Manifest, das ein oder mehrere Bilder beliebigen Typs enthält, so aus:
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
Wenn eine andere App versucht, eines dieser Elemente freizugeben, indem sie einen Intent erstellt und ihn an startActivity()
übergibt, wird Ihre Anwendung im Android-Sharesheet oder in der Intent-Auflösung als Option aufgeführt. Wenn der Nutzer Ihre App auswählt, wird die entsprechende Aktivität gestartet (.ui.MyActivity
im vorherigen Beispiel). Es liegt dann an Ihnen, die Inhalte in Ihrem Code und Ihrer Benutzeroberfläche angemessen zu verarbeiten.
Eingehende Inhalte verarbeiten
Um die von einem Intent
bereitgestellten Inhalte zu verarbeiten, rufen Sie getIntent()
auf, um das Intent
-Objekt zu erhalten. Sobald Sie das Objekt haben, können Sie seinen Inhalt untersuchen, um zu entscheiden, was als Nächstes zu tun ist. Wenn diese Aktivität von anderen Teilen des Systems (z. B. dem Launcher) gestartet werden kann, berücksichtigen Sie dies bei der Untersuchung des Intents.
Achten Sie besonders darauf, die eingehenden Daten zu prüfen, da Sie nie wissen, was eine andere Anwendung Ihnen sendet. Beispielsweise kann der falsche MIME-Typ festgelegt sein oder das gesendete Bild ist extrem groß. Denken Sie auch daran, Binärdaten in einem separaten Thread und nicht im Hauptthread („UI“) zu verarbeiten.
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... when { intent?.action == Intent.ACTION_SEND -> { if ("text/plain" == intent.type) { handleSendText(intent) // Handle text being sent } else if (intent.type?.startsWith("image/") == true) { handleSendImage(intent) // Handle single image being sent } } intent?.action == Intent.ACTION_SEND_MULTIPLE && intent.type?.startsWith("image/") == true -> { handleSendMultipleImages(intent) // Handle multiple images being sent } else -> { // Handle other intents, such as being started from the home screen } } ... } private fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update UI to reflect text being shared } } private fun handleSendImage(intent: Intent) { (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let { // Update UI to reflect image being shared } } private fun handleSendMultipleImages(intent: Intent) { intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let { // Update UI to reflect multiple images being shared } }
Java
void onCreate (Bundle savedInstanceState) { ... // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // Handle text being sent } else if (type.startsWith("image/")) { handleSendImage(intent); // Handle single image being sent } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // Handle multiple images being sent } } else { // Handle other intents, such as being started from the home screen } ... } void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared } } void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Update UI to reflect image being shared } } void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // Update UI to reflect multiple images being shared } }
Das Aktualisieren der Benutzeroberfläche nach dem Empfang der Daten kann so einfach sein wie das Ausfüllen eines EditText
oder so kompliziert wie das Anwenden eines interessanten Fotofilters auf ein Bild. Was als Nächstes passiert, hängt von Ihrer App ab.
Dafür sorgen, dass Nutzer Ihre App erkennen
Ihre App wird im Android-Sharesheet und in der Intent-Auflösung durch ihr Symbol und ihr Label dargestellt. Beide werden im Manifest definiert. Sie können Labels für Aktivitäts- oder Intent-Filter festlegen, um mehr Kontext bereitzustellen.
Ab Android 10 (API-Level 29) werden im Android Sharesheet nur Symbole verwendet, die im Manifest in Ihrem application
-Tag festgelegt sind. Android ignoriert Symbole, die für die Tags intent-filter
und activity
festgelegt sind.