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

André Cipriani Bandarra
André Cipriani Bandarra

O Web Share Target permite que os PWAs recebam conteúdo compartilhado de outros apps 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 compartilhamento.

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

Este artigo pressupõe que o desenvolvedor esteja familiarizado com as atividades confiáveis na Web. Os leitores que não conhecem a tecnologia podem começar com o Guia de integração.

Na mesma linha, uma explicação completa da implementação do alvo de compartilhamento da Web 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 PWA para este artigo, e o código-fonte está disponível no GitHub (em inglês), e o aplicativo Android é baseado na demonstração básica de Atividade na Web confiável.

Adicionar destino de compartilhamento da Web ao app Android

Para modificar um aplicativo baseado em Atividade confiável na Web para implementar o Destino de compartilhamento da Web, são necessárias modificações em três arquivos diferentes:

build.gradle

A biblioteca android-browser-helper foi atualizada para oferecer suporte ao alvo de compartilhamento da Web. Como primeira etapa, atualize o aplicativo para usar uma versão mais recente ou igual à 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 ela permite receber, como quais URLs serão abertos, o método a ser usado e os tipos MIME compatíveis.

Isso é feito por meio de um JSON, disponibilizado para a Atividade confiável na Web com um recurso de string. Os campos são os mesmos que o campo share_target disponível no manifesto da Web e podem ser adicionados a uma string dentro de strings.xml, quase no estado em que se encontra, com duas observações importantes:

  1. O valor do atributo action precisa ser o URL completo, incluindo a origem.
  2. Aspas duplas precisam ter escape, para que cada " se torne \".

A seção share_target de https://scrapbook-pwa.web.app/manifest.json tem esta aparência:

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

O novo elemento de string 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 a DelegationService seja declarada, exportada e ativada.

Os desenvolvedores que criaram o app com base na demonstração básica já têm 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 da LauncherActivity: - Uma tag meta-data que faz referência ao JSON definido em strings.xml. - Uma 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 declarada no JSON share_target.

Conclusão

A integração de destino de compartilhamento da Web permite que os PWAs dentro de uma atividade confiável na Web sejam mais profundamente integrados a outros apps instalados em um dispositivo Android.

Conforme descrito nas etapas acima, a marcação adicional necessária para adicionar suporte à API em um app Android existente que usa a Atividade confiável na Web foi simplificada pelo android-browser-helper.

Confira o artigo sobre 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 uma opção quando tento compartilhar um arquivo de outro aplicativo.

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

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

Há algumas coisas que podem causar isso. Confira a seguir uma lista de verificação:

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