Ativar o destino de compartilhamento da Web na Atividade na Web confiável

O Destino de compartilhamento da Web permite que os PWAs recebam conteúdo compartilhado de outros aplicativos instalados no dispositivo. Esse recurso pode ser usado, por exemplo, por aplicativos como editores de imagens para receber uma imagem de um app de câmera ou de uma rede social para receber uma imagem ou um vídeo para compartilhamento.

A partir do Chrome 86, o Destino de compartilhamento na Web também está disponível para aplicativos que usam a Atividade Confiável na Web. Embora o PWA funcione imediatamente, algumas mudanças são necessárias no aplicativo Android.

Neste artigo, presumimos que o desenvolvedor conheça as atividades da Web confiáveis. Os leitores que não conhecem a tecnologia podem começar com o Guia de integração.

Da mesma forma, uma explicação completa da implementação do destino de compartilhamento da Web em uma PWA está fora do escopo, e os desenvolvedores podem encontrar mais informações neste artigo.

O aplicativo de demonstração em https://scrapbook-pwa.web.app/ será usado como o PWA para este artigo. O código-fonte dele está disponível no GitHub, e o aplicativo Android é baseado na demonstração básica de Atividade Confiável na Web.

Adicionar alvo de compartilhamento da Web ao app Android

Para modificar um aplicativo baseado em Atividade confiável na Web e implementar o destino de compartilhamento da Web, é necessário modificar três arquivos diferentes:

build.gradle

A biblioteca android-browser-helper foi atualizada com suporte para o destino de compartilhamento da Web. Como primeira etapa, atualize o aplicativo para usar uma versão maior ou igual a 2.0.1.

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

res/strings.xml

O aplicativo precisa informar à Atividade na Web confiável os detalhes do compartilhamento que ele aceita, como quais URLs abrir, o método a ser usado e os tipos MIME compatíveis.

Isso é feito por um JSON, disponibilizado para a atividade da Web confiável com um recurso de string. Os campos são iguais ao campo share_target disponível no manifesto da Web e podem ser adicionados a uma string dentro de strings.xml, quase como está, com duas observações importantes:

  1. O valor do atributo "action" precisa ser o URL completo, incluindo a origem.
  2. As aspas duplas precisam ter escape, então cada " se torna \".

Confira como a seção share_target de https://scrapbook-pwa.web.app/manifest.json está:

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

E o novo elemento de string vai ficar assim:

<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

Algumas mudanças são necessárias no manifesto do Android. Primeiro, precisamos garantir que o DelegationService seja declarado, exportado e ativado.

Os desenvolvedores que criaram o aplicativo com base na demonstração básica já terão o serviço incluído, e a marcação precisa estar dentro da tag do aplicativo e ter esta aparência:

<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 fim, dois novos itens precisam ser adicionados à tag de atividade LauncherActivity: - Uma tag meta-data que faz referência ao JSON definido em strings.xml. - Um intent-filter que declara quais tipos MIME o aplicativo pode processar para outros apps no 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 pode ser visto na marcação acima, um elemento data precisa ser adicionado para cada mime-type declarado no JSON share_target.

Conclusão

A integração do Web Share Target permite que os PWAs dentro de uma atividade confiável na Web sejam mais profundamente integrados a outros aplicativos instalados em um dispositivo Android.

Conforme descrito nas etapas acima, o markup adicional necessário para adicionar suporte à API em um app Android que usa a Trusted Web Activity é simplificado pelo android-browser-helper.

Confira o artigo Destino de compartilhamento da Web para saber mais sobre como usar a API em um PWA e a API Web Share para saber como compartilhar conteúdo do Progressive Web App.

Solução de problemas

Meu aplicativo não aparece como opção quando tento compartilhar um arquivo de outro aplicativo.

Quando o aplicativo não aparece como uma opção, isso indica que o intent-filter está incorreto. Verifique a marcação intent-filter e confira se ela contém as ações, categoria e mime-types corretas processadas pelo aplicativo.

Meu aplicativo aparece como uma opção, a PWA é iniciada, mas os dados não são compartilhados.

Há algumas coisas que podem causar isso. Esta é uma lista de verificação de itens a serem observados:

  • Verifique se a validação do Digital Asset Links foi concluída.
  • Verifique se o JSON está correto em strings.xml.