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-Gerät Sharesheet oder Intent-Resolver Apps, die Daten an Ihre App senden, müssen einen MIME-Typ für diese Daten festlegen. Ihre App kann Daten empfangen, die von einer anderen App im auf folgende Arten:

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

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 Direct Share-Ziel für eine Person bereitstellen, die oder Deeplinks direkt in eine Unterhaltung mit dieser Person einfügen. Eine ausführliche Anleitung findest du unter Ziele für die direkte Freigabe angeben.

Unterstützung von MIME-Typen

Im Idealfall muss eine App den größtmöglichen Umfang an MIME-Typen empfangen können. Beispiel: eine Messaging-App zum Senden von Text, Bildern und Videos unterstützt 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.

Gute Ziele für die Funktion „Teilen“ festlegen

Wenn ein Nutzer auf ein Ziel zum Teilen tippt, das mit einer bestimmten Aktivität verknüpft ist, sollten die geteilten Inhalte bestätigen und bearbeiten können, bevor sie sie verwenden. Dies ist besonders wichtig für Textdaten.

Daten zu einer Aktivität erhalten

Der Empfang von Daten mit einer Aktivität umfasst die Aktualisierung Ihres Manifests, die Verarbeitung der und dafür zu sorgen, dass Nutzer Ihre App wiedererkennen.

Manifest aktualisieren

Mithilfe von Intent-Filtern wird das System darüber informiert, welche Intents von einer App-Komponente akzeptiert werden. Ä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. Ich definiere in deinem Manifest mit dem Element <intent-filter> einen 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 Aktionen zu teilen, indem sie einen Intent erstellt und an startActivity() weitergibt, wird Ihre App im Android-Teilen-Sheet oder im Intent-Resolver als Option aufgeführt. Wenn der Nutzer Ihre App auswählt, wird die entsprechende Aktivität gestartet (.ui.MyActivity in im vorherigen Beispiel). Dann liegt es an Ihnen, den Inhalt entsprechend zu handhaben. im Code und in der Benutzeroberfläche.

Eingehende Inhalte verarbeiten

Um die von einem Intent übermittelten Inhalte zu verarbeiten, rufe Folgendes auf: getIntent(), um das Intent-Objekt abzurufen. Sobald Sie das Objekt haben, können Sie den Inhalt überprüfen, um zu entscheiden, was Sie als Nächstes tun sollten. 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.

Überprüfen Sie die eingehenden Daten besonders sorgfältig. Sie wissen nie, was andere erhalten. Möglicherweise ist der falsche MIME-Typ festgelegt oder der das gesendete Bild möglicherweise extrem groß ist. 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. Es liegt an was als Nächstes passiert.

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-Sharesheet nur noch Symbole verwendet, die das Manifest in Ihrem application-Tag. Android ignoriert Symbole, die in den Tags intent-filter und activity festgelegt sind.