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

O Web Share Target permite que 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 por uma rede social para receber uma imagem ou um vídeo para compartilhamento.

A partir do Chrome 86, o Web Share Target também está disponível para aplicativos que usam a atividade confiável na Web. Embora o PWA funcione sem precisar de ajustes, algumas mudanças são necessárias no aplicativo Android.

Neste artigo, presumimos que o desenvolvedor esteja familiarizado com 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 Web Share Target em um 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 deste artigo. O código-fonte 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 Web Share Target, é necessário fazer mudanças em três arquivos diferentes:

build.gradle

A biblioteca android-browser-helper foi atualizada com suporte ao Web Share Target. Primeiro, atualize o aplicativo para usar uma versão igual ou superior 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 compatíveis.

Isso é feito por um JSON, disponibilizado para a Atividade da Web confiável com um recurso de string. Os campos são os mesmos do campo share_target disponível no manifesto da Web e podem ser adicionados a uma string dentro de strings.xml, quase como estão, 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. Portanto, cada " se torna \".

Esta é a aparência da seção share_target de https://googlechrome.github.io/samples/scrapbook-pwa/manifest.json:

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

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

É necessário fazer algumas mudanças 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 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 da segmentação de compartilhamento da Web permite que os PWAs em uma atividade confiável na Web sejam mais profundamente integrados a outros aplicativos instalados em um dispositivo Android.

Conforme descrito nas etapas acima, a marcação adicional necessária para adicionar suporte à API em um app Android atual que usa a atividade da Web de confiança é simplificada pelo android-browser-helper.

Confira o artigo sobre o destino de compartilhamento na Web para saber mais sobre o uso da 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. Confira a marcação intent-filter e verifique se ela contém as ações, a categoria e o mime-types corretos processados pelo aplicativo.

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

Isso pode acontecer por vários motivos. Confira uma lista de verificação dos itens a serem analisados:

  • Verifique se a validação do Digital Asset Links foi bem-sucedida.
  • Verifique se o JSON em strings.xml está correto.