Einfache Daten aus anderen Apps erhalten

Eine App kann nicht nur Daten an andere Apps senden, sondern auch Daten von anderen Apps empfangen. Überlege dir, wie Nutzer mit deiner Anwendung interagieren und welche Datentypen du von anderen Anwendungen empfangen möchtest. Eine Social-Networking-Anwendung könnte beispielsweise Textinhalte wie eine interessante Web-URL von einer anderen App empfangen wollen.

In einer App, die Compose Navigation verwendet, ist der Empfang von Daten, die von einer anderen App gesendet wurden, ein zweistufiger Prozess:

  1. Deklariere einen <intent-filter> im Manifest: Du musst deiner Aktivität in der Datei „AndroidManifest.xml“ weiterhin einen Intent Filter hinzufügen. Dadurch wird dem Android-Betriebssystem mitgeteilt, dass deine Anwendung bestimmte Aktionen (z. B. ACTION_SEND) und MIME-Typen (z. B. „text/plain“) empfangen kann.

  2. Definiere einen „navDeepLink“ in deinem Compose Navigation-Diagramm: Anstatt den Intent in den Methoden „onCreate“ oder „onNewIntent“ deiner Aktivität manuell abzufangen und zu parsen, verwende die Unterstützung für Deeplinks von Compose Navigation. Hänge einen „navDeepLink“, der der Aktion und dem MIME-Typ entspricht, direkt an das zusammensetzbare Ziel an, in dem der Inhalt angezeigt werden soll. Der „NavController“ fängt den Intent automatisch ab und leitet den Nutzer direkt zu diesem Bildschirm weiter.

„Direct Share“-Ziele sind Deeplinks zu einer bestimmten Aktivität in deiner App. Sie stellen oft eine Person oder eine Gruppe dar und werden im Android-Freigabeblatt 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 detaillierte Anleitung findest du unter „Direct Share“-Ziele bereitstellen.

MIME-Typen unterstützen

Im Idealfall muss 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 beispielsweise den Empfang von text/*, image/* und video/* unterstützen. Hier sind einige gängige MIME-Typen zum Senden und Empfangen einfacher Daten in Android.

Empfänger registrieren sich für Absender senden
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Unterstützte Dateiendungen application/pdf

Weitere Informationen findest du im offiziellen IANA-Register der MIME-Medientypen.

Gute Freigabeziele 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

Beim Empfang von Daten mit einer Aktivität musst du dein Manifest aktualisieren, die eingehenden Inhalte verarbeiten und dafür sorgen, dass der Nutzer deine App erkennt.

Manifest aktualisieren

Intent-Filter informieren das System darüber, welche Intents eine App-Komponente akzeptiert. Ähnlich wie beim Erstellen eines Intents mit einer ACTION_SEND Aktion in der Einfache Daten an andere Apps senden Lektion erstellst du Intent-Filter, um Intents mit dieser Aktion zu empfangen. Du definierst einen Intent-Filter in deinem Manifest mit dem <intent-filter> Element. Wenn deine App beispielsweise Textinhalte empfängt, würde ein Manifest, das ein oder mehrere Bilder beliebigen Typs enthält, so aussehen:

<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 deine Anwendung im Android-Freigabeblatt oder in der Intent-Auflösung als Option aufgeführt. Wenn der Nutzer deine App auswählt, wird die entsprechende Aktivität gestartet (.ui.MyActivity im vorherigen Beispiel). Anschließend musst du die Inhalte in deinem Code und deiner Benutzeroberfläche entsprechend verarbeiten.

Eingehende Inhalte verarbeiten

Um die Inhalte zu verarbeiten, die von einem Intent bereitgestellt werden, rufe getIntent() auf, um das Intent Objekt abzurufen. Sobald du das Objekt hast, kannst du 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) aus gestartet werden kann, berücksichtige dies bei der Untersuchung des Intents.

Prüfe die eingehenden Daten besonders sorgfältig. Du weißt nie, was dir eine andere Anwendung sendet. Beispielsweise kann der falsche MIME-Typ festgelegt sein oder das gesendete Bild kann extrem groß sein. Außerdem solltest du Binärdaten in einem separaten Thread und nicht im Hauptthread (UI-Thread) verarbeiten.

@Composable
fun SharesheetHandler() {
    val context = LocalContext.current
    val intent = (context as? Activity)?.intent

    when (intent?.action) {
        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_SEND_MULTIPLE -> {
            if (intent.type?.startsWith("image/") == true) {
                handleSendMultipleImages(intent) // Handle multiple images being sent
            }
        }

        else -> {
            // Handle other intents, such as being started from the home screen
        }
    }
}

fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update ViewModel state to change state of text being shared
    }
}

fun handleSendImage(intent: Intent) {
    IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image being shared
    }
}

fun handleSendMultipleImages(intent: Intent) {
    IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image(s) being shared
    }
}

Das Aktualisieren der Benutzeroberfläche nach dem Empfang der Daten kann so einfach sein wie das Ausfüllen eines TextField oder komplizierter, z. B. das Anwenden eines interessanten Fotofilters auf ein Bild. Was als Nächstes geschieht, hängt von deiner App ab.

Screenshot-URL freigeben

Wenn du einen Screenshot aufnimmst, kannst du ihn und alle zugehörigen URLs freigeben. Das sorgt für eine bessere Nutzererfahrung. Wenn du eine URL empfängst, rufe das Feld EXTRA_TEXT aus dem Intent ab, wie im folgenden Beispiel gezeigt:

IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
    // Handle the EXTRA_TEXT as well
    val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
    // Update ViewModel state to change state image being shared and the EXTRA_TEXT
    // if available
}

Dafür sorgen, dass Nutzer deine App erkennen

Deine App wird im Android Freigabeblatt und in der Intent-Auflösung durch ihr Symbol und ihr Label dargestellt. Beide werden im Manifest definiert. Du kannst Aktivitäts- oder Intent-Filter-Labels festlegen, um mehr Kontext zu liefern.

Ab Android 10 (API-Level 29) verwendet das Android-Freigabeblatt nur Symbole, die im Manifest für das Tag application festgelegt sind. Android ignoriert Symbole, die für die Tags intent-filter und activity festgelegt sind.