在 Trusted Web Activity 中启用 Web Share Target

Web Share Target 可让 PWA 接收设备上安装的其他应用分享的内容。例如,图片编辑器等应用可以使用此功能从相机应用接收图片,或者社交网络可以使用此功能接收图片或视频以供分享。

从 Chrome 86 开始,使用 Trusted Web Activity 的应用现在也可以使用 Web Share Target 了。虽然 PWA 应该可以直接使用,但需要对 Android 应用进行一些更改。

本文假定开发者熟悉 Trusted Web Activity。初次接触该技术的读者可以先阅读集成指南

同样,对 PWA 中 Web Share Target 实现的完整说明也超出了本文的范围,开发者可以在这篇文章中找到更多信息。

本文将使用 https://scrapbook-pwa.web.app/ 中的演示应用作为 PWA,其源代码可在 GitHub 上找到,而 Android 应用基于基本的可信 Web 活动演示

向 Android 应用添加 Web Share Target

如需修改现有的基于 Trusted Web Activity 的应用以实现 Web Share Target,您需要修改以下三个不同的文件:

build.gradle

android-browser-helper 库已更新,支持 Web Share Target。首先,请更新应用以使用 2.0.1 或更高版本。

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

res/strings.xml

应用需要告知 Trusted Web Activity 其支持接收的分享的详细信息,例如要打开的网址、要使用的方法和支持的 MIME 类型。

此操作通过 JSON 完成,该 JSON 可通过字符串资源提供给可信 Web 活动。这些字段与 Web 清单中提供的 share_target 字段相同,可以添加到 strings.xml 内的字符串中,几乎可以原封不动地使用,但有两点重要注意事项:

  1. 操作属性的值必须是完整网址,包括来源。
  2. 双引号必须进行转义,因此每个 " 都会变成 \"

https://googlechrome.github.io/samples/scrapbook-pwa/manifest.jsonshare_target 部分如下所示:

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

新的字符串元素将如下所示:

<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

需要在 Android 清单中进行一些更改。首先,我们需要确保已声明、导出并启用 DelegationService

如果开发者基于基本演示应用构建了自己的应用,则已包含该服务,并且标记应位于应用标记内,如下所示:

<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>

最后,需要向 LauncherActivity activity 标记添加两个新项: - 一个引用 strings.xml 中定义的 JSON 的 meta-data 标记。 - 一个 intent-filter,用于向设备上的其他应用声明应用能够处理哪些 MIME 类型。

<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>

如上述标记所示,应为 share_target JSON 中声明的每个 mime-type 添加一个 data 元素。

总结

通过 Web Share Target 集成,Trusted Web Activity 中的 PWA 可以更深入地集成到 Android 设备上安装的其他应用中。

如上述步骤中所述,android-browser-helper 可简化在现有使用 Trusted Web Activity 的 Android 应用中添加对 API 的支持所需的额外标记。

请参阅 Web Share Target 文章,详细了解如何在 PWA 上使用该 API,并参阅 Web Share API,了解如何从渐进式 Web 应用分享内容。

问题排查

当我尝试从其他应用共享文件时,我的应用未显示为选项。

如果应用未显示为选项,则表示 intent-filter 不正确。仔细检查 intent-filter 标记,确保其中包含正确的操作、类别和由应用处理的 mime-types

我的应用显示为选项,PWA 已启动,但数据未共享。

有多种原因可能会导致此问题。以下是需要检查的事项清单:

  • 确保 Digital Asset Links 验证成功。
  • 检查 strings.xml 中的 JSON 是否正确。