Habilitar Web Share Target en Trusted Web Activity

Web Share Target permite que las AWP reciban contenido compartido de otras aplicaciones instaladas en el dispositivo. Esta función es utilizada, por ejemplo, en aplicaciones como editores de imágenes para recibir una imagen de una aplicación de cámara o de una red social para recibir una imagen o un video para compartir

A partir de Chrome 86, Web Share Target también está disponible para las aplicaciones que usan Actividad web de confianza. Si bien la AWP debería funcionar de inmediato, se requieren algunos cambios para la aplicación para Android.

En este artículo, se asume que el desarrollador está familiarizado con Trusted Web Activities. Lectores nuevos en Para comenzar a usar la tecnología, consulta la Guía de integración.

Del mismo modo, la explicación completa de la implementación del objetivo de Web Share en una AWP está fuera y los desarrolladores pueden encontrar más información en este artículo.

Se usará la aplicación de demostración https://scrapbook-pwa.web.app/ como AWP y su código fuente está disponible en GitHub, y la aplicación para Android se basa en la demostración básica de Trusted Web Activity.

Cómo agregar Web Share Target a la app para Android

Para modificar una aplicación existente basada en Trusted Web Activity para implementar Web Share Destino, se requieren modificaciones en tres archivos diferentes:

build.gradle

Se actualizó la biblioteca android-browser-helper para que sea compatible con Web Share Target. Como primer paso, actualiza la aplicación para usar una versión posterior o igual a 2.0.1.

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

res/strings.xml

La aplicación debe indicar a la Actividad web de confianza los detalles del uso compartido que admite. como las URLs que se abrirán, el método que se usará y los tipos de MIME admitidos.

Esto se hace a través de un JSON, disponible para Trusted Web Activity con un recurso de cadenas. El son iguales al campo share_target disponible en el manifiesto web y se pueden agregar una cadena dentro de strings.xml, casi tal como está, con dos notas importantes:

  1. El valor del atributo de acción debe ser la URL completa, incluido el origen.
  2. Las comillas dobles deben escaparse, de modo que cada " se convierta en \".

Así se ve la sección share_target de https://scrapbook-pwa.web.app/manifest.json como:

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

Y el nuevo elemento de cadena se verá de la siguiente manera:

<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

Se deben realizar algunos cambios en el manifiesto de Android. Primero, debemos asegurarnos de que el Se declara, exporta y habilita DelegationService.

Los desarrolladores que compilaron su aplicación según la demostración básica ya tendrán el servicio y el lenguaje de marcado debe estar dentro de la etiqueta de aplicación y verse de la siguiente manera:

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

Por último, se deben agregar dos elementos nuevos a la etiqueta de actividad LauncherActivity: - Una etiqueta meta-data que haga referencia al JSON definido en strings.xml - Un objeto intent-filter que declara qué tipos de MIME la aplicación puede controlar en el dispositivo.

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

Como se puede ver en el lenguaje de marcado anterior, se debe agregar un elemento data por cada mime-type declarado en el JSON share_target.

Conclusión

La integración del objetivo de Web Share permite que las AWP dentro de una actividad web de confianza sean más profundas integrados con otras aplicaciones instaladas en un dispositivo Android.

Como se describió en los pasos anteriores, el lenguaje de marcado adicional necesario para agregar compatibilidad con la API en una android-browser-helper simplifica la app para Android existente que usa Trusted Web Activity.

Consulta el artículo sobre el Objetivo de Compartir en la Web para obtener más información sobre cómo usar la API en una AWP y la API de Web Share para obtener información sobre cómo compartir contenido desde la app web progresiva.

Soluciona problemas

Mi aplicación no aparece como opción cuando intento compartir un archivo desde otra aplicación.

Si la aplicación no se muestra como opción, esto indica que intent-filter está incorrecto. Vuelve a verificar el lenguaje de marcado de intent-filter y asegúrate de que contenga las acciones correctas. categoría y mime-types controlados por la aplicación.

Mi aplicación muestra como opción que se inicia la AWP, pero los datos no se comparten.

Hay varias causas posibles. Esta es una lista de verificación de lo que debes tener en cuenta:

  • Asegúrese de que la validación de Vínculos de recursos digitales sea exitosa.
  • Revisa el JSON dentro de strings.xml para verificar que sea correcto.