Einfache Daten aus anderen Apps erhalten

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 Textinhalte wie eine interessante Web-URL von einer anderen App empfangen.

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

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

  2. Definieren Sie einen navDeepLink in Ihrem Compose-Navigationsdiagramm: Anstatt den Intent in den Methoden onCreate oder onNewIntent Ihrer Aktivität manuell abzufangen und zu parsen, verwenden Sie die Unterstützung für Deeplinks von Compose Navigation. Hängen Sie einen „navDeepLink“ an, 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 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 detaillierte Anleitung finden Sie unter Direct Share-Ziele angeben.

Unterstützte MIME-Typen

Im Idealfall sollte eine App möglichst viele MIME-Typen empfangen können. Eine Messaging-App, die zum Senden von Text, Bildern und Videos entwickelt wurde, sollte idealerweise 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 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 einer ACTION_SEND-Aktion 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, könnte 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 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

Wenn Sie die von einem Intent bereitgestellten Inhalte verarbeiten möchten, rufen Sie getIntent() auf, um das Intent-Objekt abzurufen. 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.

Prüfen Sie die eingehenden Daten sorgfältig, da Sie nie wissen, was eine andere Anwendung Ihnen sendet. Möglicherweise ist der falsche MIME-Typ festgelegt oder das gesendete Bild ist sehr groß. Denken Sie auch daran, Binärdaten in einem separaten Thread und nicht im Hauptthread („UI“) zu verarbeiten.

@Composable
fun SharesheetHandler() {
    val activity = LocalActivity.current
    val intent = activity?.intent

    when (intent?.action) {
        Intent.ACTION_SEND -> {
            if (intent.type == "text/plain") {
                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
        }
    }
}

private fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update UI state with the shared text
    }
}

private fun handleSendImage(intent: Intent) {
    val imageUri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUri?.let {
        // Update UI state with the shared image
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    val imageUris =
        IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUris?.let {
        // Update UI state with the shared images
    }
}

Das Aktualisieren der Benutzeroberfläche nach dem Empfang der Daten kann so einfach sein wie das Einfügen von Daten in ein TextField. Es kann aber auch komplizierter sein, z. B. wenn ein interessanter Fotofilter auf ein Bild angewendet wird. Was als Nächstes passiert, hängt von Ihrer App ab.

Screenshot-URL freigeben

Wenn Sie einen Screenshot erstellen, können Sie ihn und die zugehörige URL teilen. Das sorgt für eine bessere Nutzererfahrung. Wenn Sie eine URL empfangen, müssen Sie das Feld EXTRA_TEXT aus dem Intent abrufen, 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 UI state with the shared image and the EXTRA_TEXT if available
}

Nutzer sollen 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.