Включить целевой веб-ресурс в доверенной веб-активности

Web Share Target позволяет PWA получать общий контент из других приложений, установленных на устройстве. Эта функция может использоваться, например, такими приложениями, как редакторы изображений, для получения изображения из приложения камеры или социальной сетью для получения изображения или видео для обмена.

Начиная с Chrome 86, Web Share Target теперь также доступна для приложений, использующих Trusted Web Activity . Хотя PWA должно работать «из коробки», в приложение Android необходимо внести несколько изменений.

В этой статье предполагается, что разработчик знаком с доверенными веб-действиями. Читатели, не знакомые с этой технологией, могут начать работу с Руководством по интеграции .

Точно так же полное объяснение реализации Web Share Target в PWA выходит за рамки, и разработчики могут найти дополнительную информацию в этой статье .

Демо-приложение по адресу https://scrapbook-pwa.web.app/ будет использоваться в качестве PWA для этой статьи, его исходный код доступен на GitHub , а приложение Android основано на базовой демонстрации Trusted Web Activity .

Добавьте цель общего доступа в Интернет в приложение Android

Чтобы изменить существующее приложение на основе доверенной веб-активности для реализации цели веб-ресурса, необходимо внести изменения в три разных файла:

build.gradle

В библиотеку android-browser-helper добавлена ​​поддержка Web Share Target. В качестве первого шага обновите приложение, чтобы использовать версию выше или равную 2.0.1.

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

res/strings.xml

Приложению необходимо сообщить Доверенному веб-действию подробную информацию о совместном использовании, которое оно поддерживает, например, какие URL-адреса открывать, какой метод использовать и поддерживаемые типы mime.

Это делается через JSON, доступный доверенному веб-действию с помощью строкового ресурса. Поля такие же, как поле share_target , доступное в веб-манифесте, и могут быть добавлены в строку внутри strings.xml почти как есть, с двумя важными примечаниями:

  1. Значением атрибута действия должен быть полный URL-адрес, включая источник.
  2. Двойные кавычки должны быть экранированы, чтобы каждая из них " стала \" .

Вот как выглядит раздел share_target в https://scrapbook-pwa.web.app/manifest.json :

{
  ...
  "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 необходимо добавить два новых элемента: — Тег meta-data , который ссылается на JSON, определенный в strings.xml. - 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>

Как видно из разметки выше, элемент data должен быть добавлен для каждого mime-type объявленного в share_target .

Заключение

Интеграция Web Share Target позволяет PWA внутри доверенной веб-активности более глубоко интегрироваться с другими приложениями, установленными на устройстве Android.

Как описано в приведенных выше шагах, дополнительная разметка, необходимая для добавления поддержки API в существующее приложение Android, использующее доверенную веб-активность, упрощается с помощью android-browser-helper.

Ознакомьтесь со статьей Web Share Target, чтобы узнать больше об использовании API в PWA и API Web Share, чтобы узнать, как делиться контентом из Progressive Web App.

Поиск неисправностей

Мое приложение не отображается в качестве опции, когда я пытаюсь поделиться файлом из другого приложения.

Если приложение не отображается в качестве опции, это означает, что intent-filter неверен. Дважды проверьте разметку intent-filter и убедитесь, что она содержит правильные действия, категории и mime-types , обрабатываемые приложением.

Мое приложение отображается в качестве опции, PWA запущено, но данные не передаются.

Есть несколько вещей, которые могут вызвать это. Это контрольный список того, на что следует обратить внимание:

  • Убедитесь, что проверка ссылок на цифровые активы прошла успешно.
  • Проверьте JSON внутри файла strings.xml на корректность.