Criar links diretos para conteúdo de app

Quando um link clicado ou uma solicitação programática invoca uma intent de URI da Web, o sistema Android tenta cada uma das seguintes ações, em ordem sequencial, até que a solicitação seja bem-sucedida:

  1. Abrir o app preferencial do usuário para processar o URI, se houver um app designado.
  2. Abrir o único app disponível para processar o URI.
  3. Permitir que o usuário selecione um app em uma caixa de diálogo.

Siga as etapas abaixo para criar e testar links para seu conteúdo. Você também pode usar o App Links Assistant no Android Studio para adicionar Android App Links.

Observação : no Android 12 (nível 31 da API) e versões mais recentes, uma intent da Web genérica só é resolvida como uma atividade no app quando ele é aprovado para o domínio específico contido nessa intent da Web. Se o app não for aprovado para o domínio, a intent da Web será resolvida para o app de navegador padrão do usuário.

Adicionar filtros de intent para links recebidos

Para criar um link para o conteúdo do app, adicione um filtro de intent que contenha estes elementos e valores de atributo no manifesto:

<action>
Especifique a ação de intent ACTION_VIEW para que o filtro de intent seja acessado na Pesquisa Google.
<data>
Adicione uma ou mais tags <data>, cada uma representando um formato de URI resolvido para a atividade. No mínimo, a tag <data> precisa incluir o atributo android:scheme.

É possível adicionar outros atributos para refinar ainda mais o tipo de URI aceito pela atividade. Por exemplo, você pode ter várias atividades que aceitam URIs semelhantes, mas que diferem simplesmente com base no nome do caminho. Nesse caso, use o atributo android:path ou as variantes pathPattern ou pathPrefix para diferenciar qual atividade o sistema precisa abrir para diferentes caminhos de URI.

<category>
Inclua a categoria BROWSABLE. Ele é necessário para que o filtro de intent possa ser acessado em um navegador da Web. Sem ela, não é possível clicar no link de um navegador para seu app.

Inclua também a categoria DEFAULT. Ela permite que o app responda a intents implícitas. Sem isso, a atividade só poderá ser iniciada se a intent especificar o nome do componente do app.

O snippet XML a seguir mostra como especificar um filtro de intent no manifesto para links diretos. Os URIs “example://gizmos” e “http://www.example.com/gizmos” são resolvidos para essa atividade.

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos” -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

A única diferença entre os dois filtros de intent é o elemento <data>. Embora seja possível incluir vários elementos <data> no mesmo filtro, é importante criar filtros separados quando sua intenção for declarar URLs exclusivos (como uma combinação específica de scheme e host), já que vários elementos <data> no mesmo filtro de intent são mesclados para considerar todas as variações dos atributos combinados. Por exemplo, considere o seguinte:

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

Pode parecer que esse filtro é compatível apenas com https://www.example.com e app://open.my.app. No entanto, ele oferece suporte aos dois, além destes: app://www.example.com e https://open.my.app.

Cuidado:se várias atividades tiverem filtros de intent que são resolvidos para o mesmo Link do app Android verificado, não haverá garantia de qual atividade vai processar o link.

Depois de adicionar filtros de intent com URIs para conteúdo de atividade ao manifesto do app, o Android vai poder rotear qualquer Intent que tenha URIs correspondentes para o app durante a execução.

Para saber mais sobre como definir filtros de intent, consulte Como permitir que outros apps iniciem sua atividade.

Ler dados de intents recebidas

Depois que o sistema inicia sua atividade usando um filtro de intent, você pode usar os dados fornecidos pelo Intent para determinar o que precisa ser renderizado. Chame os métodos getData() e getAction() para extrair os dados e a ação associada à Intent recebida. É possível chamar esses métodos a qualquer momento durante o ciclo de vida da atividade, mas geralmente é necessário fazer isso durante os callbacks iniciais, como onCreate() ou onStart().

Confira um snippet que mostra como extrair dados de uma Intent:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

Siga estas práticas recomendadas para melhorar a experiência do usuário:

  • O link direto precisa levar os usuários diretamente ao conteúdo, sem solicitações, páginas intersticiais ou logins. Verifique se os usuários podem ver o conteúdo do app, mesmo que eles nunca tenham aberto o app antes. Não há problema em perguntar aos usuários em interações posteriores ou quando eles abrirem o app na tela de início.
  • Siga as orientações de design descritas em Navegação com Voltar e Para cima para que o app corresponda às expectativas dos usuários em relação à navegação anterior depois que eles acessarem o app por meio de um link direto.

Testar os links diretos

Você pode usar o Android Debug Bridge com a ferramenta Gerenciador de atividades (AM, na sigla em inglês) para testar se os URIs do filtro de intent especificados para links diretos se referem à atividade correta do app. É possível executar o comando adb em um dispositivo ou emulador.

A sintaxe geral para testar um URI de filtro de intent com adb é:

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

Por exemplo, o comando abaixo tenta visualizar uma atividade no app de destino associada ao URI especificado.

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

A declaração do manifesto e o gerenciador de intents que você configurou acima definem a conexão entre seu app e um site e o que fazer com os links de entrada. No entanto, para que o sistema trate seu app como gerenciador padrão de um conjunto de URIs, também é necessário solicitar que o sistema verifique essa conexão. A próxima aula explica como implementar essa verificação.

Para saber mais sobre intents e links de app, consulte os seguintes recursos: