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. Beispielsweise könnte eine Anwendung eines sozialen Netzwerks daran interessiert sein, Textinhalte wie eine interessante Web-URL von einer anderen Anwendung zu empfangen.

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

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

Bei Direct Share-Zielen handelt es sich um Deeplinks zu einer bestimmten Aktivität in Ihrer App. Sie repräsentieren häufig eine Person oder eine Gruppe, die auf dem Android-Sharesheet angezeigt wird. Eine Messaging-App kann beispielsweise ein Direct Share-Ziel für eine Person bereitstellen, die Deeplinks direkt zu einer Unterhaltung mit dieser Person führt. Eine ausführliche Anleitung finden Sie unter Direct Share-Ziele angeben.

MIME-Typen unterstützen

Idealerweise sollte eine Anwendung in der Lage sein, möglichst viele MIME-Typen zu empfangen. Beispielsweise unterstützt eine Messaging-App zum Senden von Text, Bildern und Videos idealerweise den Empfang von text/*, image/* und video/*. Hier sind einige gängige MIME-Typen zum Senden und Empfangen einfacher Daten unter 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 in der offiziellen Registry der IANA für MIME-Medientypen.

Tolle Ziele für das Teilen von Inhalten

Wenn ein Nutzer auf ein Freigabeziel tippt, das mit einer bestimmten Aktivität verknüpft ist, sollte er in der Lage sein, die geteilten Inhalte vor der Verwendung zu bestätigen und zu bearbeiten. Das ist besonders für Textdaten wichtig.

Daten mit einer Aktivität empfangen

Wenn Sie Daten mit einer Aktivität empfangen möchten, müssen Sie Ihr Manifest aktualisieren, den eingehenden Inhalt verarbeiten und dafür sorgen, dass der Nutzer Ihre App erkennt.

Manifest aktualisieren

Intent-Filter informieren das System, welche Intents eine App-Komponente akzeptiert. Ähnlich wie beim Erstellen eines Intents mit einer ACTION_SEND-Aktion in der Lektion Einfache Daten an andere Anwendungen senden erstellen Sie Intent-Filter, um mit dieser Aktion Intents zu erhalten. Mit dem Element <intent-filter> definieren Sie einen Intent-Filter in Ihrem Manifest. Wenn Ihre 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 Dinge zu teilen, indem sie einen Intent erstellt und an startActivity() übergibt, wird Ihre Anwendung als Option im Android Sharesheet oder im Intent-Resolver aufgeführt. Wenn der Nutzer Ihre Anwendung auswählt, wird die entsprechende Aktivität gestartet (im vorherigen Beispiel .ui.MyActivity). Sie müssen dann den Inhalt im Code und in der UI entsprechend behandeln.

Eingehende Inhalte verarbeiten

Wenn Sie den von einem Intent bereitgestellten Inhalt verarbeiten möchten, rufen Sie getIntent() auf, um das Intent-Objekt abzurufen. Sobald Sie das Objekt haben, können Sie seinen Inhalt prüfen, um festzustellen, 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 Untersuchung des Intents.

Prüfen Sie die eingehenden Daten besonders sorgfältig, da Sie nie wissen, welche anderen Anwendungen Ihnen möglicherweise senden. Beispielsweise könnte der falsche MIME-Typ festgelegt sein oder das gesendete Bild ist extrem groß. Vergessen Sie auch nicht, 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 komplizierter 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 wiedererkennen

Deine App wird im Android Sharesheet und im Intent-Resolver durch ihr Symbol und Label dargestellt. Beide sind 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 Ihres application-Tags festgelegt wurden. Android ignoriert Symbole, die in den Tags intent-filter und activity festgelegt wurden.