Einfache Daten aus anderen Apps erhalten

Genauso wie eine App Daten an andere Apps senden kann, kann sie 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 Anwendung für soziale Netzwerke könnte beispielsweise Textinhalte wie eine interessante Web-URL von einer anderen App empfangen.

Nutzer anderer Apps senden häufig Daten über das Android-Freigabe-Menü 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 Arten empfangen:

  • Ein Activity mit einem übereinstimmenden intent-filter-Tag im Manifest
  • Von Ihrer App veröffentlichte Kurzbefehle teilen

Ziele für die direkte Freigabe sind Deeplinks zu einer bestimmten Aktivität in Ihrer App. Sie stehen oft für eine Person oder eine Gruppe und werden im Android-Freigabe-Sheet angezeigt. Eine Messaging-App kann beispielsweise ein Ziel für die direkte Freigabe für eine Person bereitstellen, das Deeplinks direkt zu einer Unterhaltung mit dieser Person enthält. Eine ausführliche Anleitung findest du unter Ziele für die direkte Freigabe angeben.

MIME-Typen unterstützen

Idealerweise muss eine App den größtmöglichen Umfang 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/* unterstützen. 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 MIME-Medientyp-Registrierung der IANA.

Gute Ziele für die Funktion „Teilen“ festlegen

Wenn ein Nutzer auf ein Freigabeziel 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 wichtig für Textdaten.

Daten mit einer Aktivität erhalten

Wenn Sie Daten mit einer Aktivität empfangen möchten, 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 Sie in der Lektion Einfache Daten an andere Apps senden einen Intent mit einer ACTION_SEND-Aktion erstellt haben, 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, würde ein Manifest mit einem oder mehreren Bildern beliebigen Typs in etwa 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, eine dieser Informationen zu teilen, indem sie einen Intent erstellt und an startActivity() weitergibt, wird Ihre App als Option im Android-Teilen-Sheet oder im Intent-Resolver 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 du die von einem Intent bereitgestellten Inhalte verarbeiten möchtest, rufe getIntent() auf, um das Intent-Objekt abzurufen. Sobald Sie das Objekt haben, können Sie den Inhalt prüfen, um zu entscheiden, was Sie als Nächstes tun möchten. Wenn diese Aktivität von anderen Teilen des Systems gestartet werden kann (z. B. über den Launcher), berücksichtigen Sie dies bei der Prüfung der Absicht.

Prüfen Sie die eingehenden Daten besonders sorgfältig. Sie wissen nie, was eine andere Anwendung Ihnen senden könnte. 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 Haupt- („UI“)-Thread 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 Erhalt der Daten kann so einfach sein wie das Ausfüllen eines EditText oder auch komplizierter, z. B. wenn ein interessanter Fotofilter auf ein Bild angewendet wird. Was als Nächstes passiert, liegt in der Hand Ihrer App.

Sorgen Sie dafür, dass Nutzer Ihre App erkennen

Ihre App wird im Android-Freigabebereich und im Intent-Resolver durch ihr Symbol und Label dargestellt. Beide werden im Manifest definiert. Sie können Aktivitäts- oder Intent-Filterlabels festlegen, um mehr Kontext zu erhalten.

Ab Android 10 (API-Level 29) werden im Android-Teilen-Sheet nur Symbole verwendet, die im Manifest Ihres application-Tags festgelegt sind. Android ignoriert Symbole, die in den Tags intent-filter und activity festgelegt sind.