Web Share Target in Trusted Web Activity aktivieren

Mit Web Share Target können PWAs freigegebene Inhalte von anderen auf dem Gerät installierten Anwendungen empfangen. Diese Funktion kann beispielsweise von Bildbearbeitungs-Apps verwendet werden, um ein Bild von einer Kamera-App zu empfangen, oder von sozialen Netzwerken, um ein Bild oder Video zum Teilen zu empfangen.

Ab Chrome 86 ist Web Share Target auch für Anwendungen verfügbar, die Trusted Web Activity verwenden. Die PWA sollte sofort funktionieren, aber für die Android-Anwendung sind einige Änderungen erforderlich.

In diesem Artikel wird davon ausgegangen, dass der Entwickler mit Trusted Web Activities vertraut ist. Leser, die mit der Technologie noch nicht vertraut sind, können mit dem Integrationsleitfaden beginnen.

Eine vollständige Beschreibung der Web Share Target-Implementierung in einer PWA geht über den Rahmen dieses Artikels hinaus. Entwickler finden weitere Informationen in diesem Artikel.

Die Demoanwendung unter https://scrapbook-pwa.web.app/ wird in diesem Artikel als PWA verwendet. Der Quellcode ist GitHub verfügbar. Die Android-Anwendung basiert auf der einfachen Demo für vertrauenswürdige Web-Aktivitäten.

Web Share Target zur Android-App hinzufügen

Wenn Sie eine vorhandene Anwendung, die auf einer vertrauenswürdigen Web-Aktivität basiert, so ändern möchten, dass sie Web Share Target implementiert, sind Änderungen an drei verschiedenen Dateien erforderlich:

build.gradle

Die Bibliothek android-browser-helper wurde aktualisiert und unterstützt jetzt Web Share Target. Aktualisieren Sie die Anwendung als Erstes auf eine Version, die mindestens 2.0.1 entspricht.

dependencies {
    ...
    implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.2.0'
}

res/strings.xml

Die Anwendung muss der Trusted Web Activity die Details der unterstützten Freigabe mitteilen, z. B. welche URLs geöffnet werden sollen, welche Methode verwendet werden soll und welche MIME-Typen unterstützt werden.

Dies erfolgt über eine JSON-Datei, die der Trusted Web Activity mit einer String-Ressource zur Verfügung gestellt wird. Die Felder sind dieselben wie das Feld share_target im Web-Manifest und können fast unverändert in einen String innerhalb von strings.xml eingefügt werden. Es gibt jedoch zwei wichtige Hinweise:

  1. Der Wert des Attributs „action“ muss die vollständige URL einschließlich des Ursprungs sein.
  2. Doppelte Anführungszeichen müssen maskiert werden. Jedes " wird also zu \".

So sieht der share_target-Abschnitt von https://scrapbook-pwa.web.app/manifest.json aus:

{
  ...
  "share_target": {
    "action": "/_share-target",
    "enctype": "multipart/form-data",
    "method": "POST",
    "params": {
      "files": [{
        "name": "media",
        "accept": [
          "audio/*",
          "image/*",
          "video/*"
        ]
      }]
    }
  },
  ...
}

Das neue String-Element sieht so aus:

<string name="share_target">
{
    \"action\": \"https://twa-web-scrapbook.web.app/_share-target\",
    \"method\": \"POST\",
    \"enctype\": \"multipart/form-data\",
    \"params\": {
      \"files\": [{
          \"name\": \"media\",
          \"accept\": [\"image/*\", \"audio/*\", \"video/*\"]
      }]
    }
}
</string>

AndroidManifest.xml

Am Android-Manifest sind einige Änderungen erforderlich. Zuerst müssen wir dafür sorgen, dass die DelegationService deklariert, exportiert und aktiviert ist.

Entwickler, die ihre Anwendung auf der Grundlage der einfachen Demo erstellt haben, haben den Dienst bereits eingebunden. Das Markup sollte sich innerhalb des Anwendungstags befinden und so aussehen:

<service
    android:name="com.google.androidbrowserhelper.trusted.DelegationService"
    android:enabled="true"
    android:exported="true">

    <intent-filter>
        <action android:name="android.support.customtabs.trusted.TRUSTED_WEB_ACTIVITY_SERVICE"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</service>

Schließlich müssen dem Aktivitätstag „LauncherActivity“ zwei neue Elemente hinzugefügt werden: - Ein meta-data-Tag, das auf das in „strings.xml“ definierte JSON verweist. – Ein intent-filter, das anderen Apps auf dem Gerät mitteilt, welche MIME-Typen die Anwendung verarbeiten kann.

<meta-data
    android:name="android.support.customtabs.trusted.METADATA_SHARE_TARGET"
    android:resource="@string/share_target"/>

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <action android:name="android.intent.action.SEND_MULTIPLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="audio/*" />
    <data android:mimeType="image/*" />
    <data android:mimeType="video/*" />
</intent-filter>

Wie im Markup oben zu sehen ist, sollte für jede in der share_target-JSON deklarierte mime-type ein data-Element hinzugefügt werden.

Fazit

Durch die Integration von Web Share Target können PWAs in einer Trusted Web Activity besser in andere auf einem Android-Gerät installierte Anwendungen eingebunden werden.

Wie in den obigen Schritten beschrieben, wird das zusätzliche Markup, das zum Hinzufügen der Unterstützung für die API in einer vorhandenen Android-App, die Trusted Web Activity verwendet, durch android-browser-helper vereinfacht.

Weitere Informationen zur Verwendung der API in einer PWA finden Sie im Artikel zum Web Share Target. Informationen zum Teilen von Inhalten aus der Progressive Web App finden Sie in der Web Share API.

Fehlerbehebung

Meine App wird nicht als Option angezeigt, wenn ich versuche, eine Datei aus einer anderen App zu teilen.

Wenn die Anwendung nicht als Option angezeigt wird, ist die intent-filter falsch. Prüfen Sie das intent-filter-Markup und achten Sie darauf, dass es die richtigen Aktionen, Kategorien und mime-types enthält, die von der Anwendung verarbeitet werden.

Meine Anwendung wird als Option angezeigt, die PWA wird gestartet, aber die Daten werden nicht freigegeben.

Das kann mehrere Gründe haben. Hier ist eine Checkliste mit Punkten, die Sie überprüfen sollten:

  • Prüfen Sie, ob die Validierung der Digital Asset Links erfolgreich war.
  • Prüfen Sie, ob das JSON in „strings.xml“ korrekt ist.