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 imagem para receber uma imagem de um app de câmera ou uma rede social para receber uma imagem ou um vídeo para compartilhar.

A partir do Chrome 86, o destino de compartilhamento da Web também está disponível para aplicativos que usam a Atividade confiável na Web. Embora a PWA funcione imediatamente, algumas mudanças são necessárias no app 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 o destino 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 confiável na Web os detalhes do compartilhamento que ele aceita receber, como quais URLs abrir, o método a ser usado e os tipos MIME aceitos.

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 precisará estar dentro da tag do aplicativo e ter a seguinte 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 destino de compartilhamento da Web permite que os PWAs em uma atividade confiável na Web sejam mais bem 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 sobre o destino de compartilhamento da Web para saber mais sobre o uso da API em um PWA e a API Web Share para aprender a compartilhar conteúdo do app da Web progressiva.

Solução de problemas

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

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. Confira uma lista de verificação com o que observar:

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