Einfache Daten aus anderen Apps erhalten

Eine App kann Daten nicht nur an andere Apps senden, sondern auch von anderen Apps empfangen. Überlegen Sie, wie Nutzer mit Ihrer Anwendung interagieren und welche Datentypen Sie von anderen Anwendungen erhalten möchten. Eine Anwendung für soziale Netzwerke könnte beispielsweise daran interessiert sein, Textinhalte wie eine interessante Web-URL von einer anderen App zu empfangen.

Nutzer anderer Apps senden häufig Daten über das Android-Sharesheet oder den Intent-Resolver an deine App. Apps, die Daten an Ihre App senden, müssen einen MIME-Typ für diese Daten festlegen. Ihre Anwendung kann auf folgende Arten Daten empfangen, die von einer anderen Anwendung gesendet wurden:

  • Ein Activity mit einem übereinstimmenden intent-filter-Tag im Manifest
  • Von deiner App veröffentlichte Verknüpfungen werden geteilt.

Ziele für direktes Teilen sind Deeplinks zu einer bestimmten Aktivität in deiner App. Sie stellen oft eine Person oder Gruppe dar und werden im Android-Sharesheet angezeigt. Eine Messaging-App kann beispielsweise ein Direct Share-Ziel für eine Person bereitstellen, über die Links direkt in eine Unterhaltung mit dieser Person eingefügt werden. Eine ausführliche Anleitung finden Sie unter Direct Share-Ziele angeben.

Unterstützung von MIME-Typen

Im Idealfall muss eine App die größtmögliche Anzahl von MIME-Typen empfangen können. Beispielsweise unterstützt eine Messaging-App, die zum Senden von Text, Bildern und Videos konzipiert ist, idealerweise den Empfang von text/*, image/* und video/*. Im Folgenden finden Sie einige gängige MIME-Typen für das 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.

Tolle Ziele fürs Teilen

Wenn ein Nutzer auf ein geteiltes Ziel tippt, das mit einer bestimmten Aktivität verknüpft ist, sollte er die geteilten Inhalte bestätigen und bearbeiten können, bevor er sie verwendet. Das ist besonders bei Textdaten wichtig.

Daten zu einer Aktivität erhalten

Um Daten mit einer Aktivität zu empfangen, müssen Sie Ihr Manifest aktualisieren, die eingehenden Inhalte verarbeiten und dafür sorgen, dass der Nutzer Ihre App erkennt.

Manifest aktualisieren

Mithilfe von Intent-Filtern wird das System darüber informiert, welche Intents von einer App-Komponente akzeptiert werden. Ä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 erhalten. Einen Intent-Filter werden in Ihrem Manifest mit dem Element <intent-filter> definiert. Wenn deine App beispielsweise Textinhalte empfängt, würde ein Manifest, das ein oder mehrere Bilder beliebigen Typs enthält, wie das folgende Snippet 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 ein Intent erstellt und an startActivity() übergeben wird, wird Ihre App als Option im Android-Sharesheet oder im Intent-Resolver aufgeführt. Wenn der Nutzer Ihre App auswählt, wird die entsprechende Aktivität gestartet (im vorherigen Beispiel .ui.MyActivity). Es liegt an Ihnen, den Inhalt innerhalb des Codes und der Benutzeroberfläche entsprechend zu handhaben.

Eingehende Inhalte verarbeiten

Zur Verarbeitung der von einem Intent bereitgestellten Inhalte rufen Sie getIntent() auf, um das Intent-Objekt abzurufen. Sobald Sie das Objekt haben, können Sie seinen Inhalt überprüfen, um zu entscheiden, was als Nächstes zu tun ist. Wenn diese Aktivität von anderen Teilen des Systems aus gestartet werden kann (z. B. vom Launcher), berücksichtigen Sie dies bei der Prüfung des Intents.

Prüfen Sie die eingehenden Daten besonders sorgfältig. Sie wissen nie, was eine andere Anwendung Ihnen sendet. Möglicherweise ist der falsche MIME-Typ festgelegt 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 UI nach dem Empfang der Daten kann so einfach sein wie das Ausfüllen eines EditText. Es kann aber auch komplizierter sein, wie das Anwenden eines interessanten Fotofilters auf ein Bild. Es liegt an deiner App, was als Nächstes passiert.

Sicherstellen, dass Nutzer Ihre App erkennen

Deine App wird im Android-Sharesheet und im Intent-Resolver durch Symbol und Label repräsentiert. Beides ist 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) verwendet das Android-Sharesheet nur Symbole, die im Manifest deines application-Tags festgelegt sind. Symbole, die mit den Tags intent-filter und activity festgelegt wurden, werden von Android ignoriert.