Web Share Target in Trusted Web Activity aktivieren

Web Share Target ermöglicht PWAs den Empfang freigegebener Inhalte von anderen auf dem Gerät installierten Anwendungen. Diese Funktion kann beispielsweise von Bildbearbeitungsprogrammen 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 es sind einige Änderungen an der Android-Anwendung erforderlich.

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

Ebenso würde eine vollständige Erläuterung der Web Share Target-Implementierung in einer PWA den Rahmen dieses Artikels sprengen . 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 auf GitHub verfügbar. Die Android-Anwendung basiert auf der grundlegenden Trusted Web Activity-Demo.

Web Share Target zur Android-App hinzufügen

Wenn Sie eine vorhandene Anwendung, die auf Trusted Web Activity basiert, so ändern möchten, dass Web Share Target implementiert wird, sind Änderungen an drei verschiedenen Dateien erforderlich:

build.gradle

Die android-browser-helper-Bibliothek wurde mit Unterstützung für Web Share Target aktualisiert. Aktualisieren Sie die Anwendung zuerst 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 Freigabe mitteilen, die sie empfangen kann, 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, die der Trusted Web Activity mit einer Stringressource zur Verfügung gestellt wird. Die Felder sind dieselben wie das Feld share_target im Web Manifest und können fast unverändert zu einem String in strings.xml hinzugefügt werden. Dabei sind jedoch zwei wichtige Punkte zu beachten:

  1. Der Wert des Attributs „action“ muss die vollständige URL einschließlich des Ursprungs sein.
  2. Doppelte Anführungszeichen müssen mit einem Escapezeichen versehen werden, sodass jedes " zu \" wird.

So sieht der share_target Abschnitt von https://googlechrome.github.io/samples/scrapbook-pwa/manifest.json aus:

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

Und so sieht das neue Stringelement 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

Im Android-Manifest sind einige Änderungen erforderlich. Zuerst müssen wir sicherstellen, dass DelegationService deklariert, exportiert und aktiviert ist.

Entwickler, die ihre Anwendung auf der grundlegenden Demo aufgebaut 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 die in „strings.xml“ definierte JSON verweist. - Ein intent-filter, der deklariert, welche MIME-Typen die Anwendung an andere Apps auf dem Gerät senden 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 jeden in der share_target-JSON deklarierten mime-type ein data-Element hinzugefügt werden.

Fazit

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

Wie in den Schritten oben beschrieben, wird das zusätzliche Markup, das erforderlich ist, um Unterstützung für die API in einer vorhandenen Android-App hinzuzufügen, die Trusted Web Activity verwendet, durch android-browser-helper vereinfacht.

Im Artikel Web Share Target erfahren Sie mehr über die Verwendung der API in einer PWA. Im Artikel Web Share API erfahren Sie, wie Sie Inhalte aus der progressiven Web-App freigeben.

Fehlerbehebung

Meine Anwendung wird nicht als Option angezeigt, wenn ich versuche, eine Datei aus einer anderen Anwendung freizugeben.

Wenn die Anwendung nicht als Option angezeigt wird, ist der intent-filter falsch. Prüfen Sie das intent-filter-Markup und stellen Sie sicher, 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.

Dafür kann es mehrere Gründe geben. Hier ist eine Checkliste mit möglichen Ursachen:

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