Criar links diretos

Com os links diretos, você pode levar os usuários diretamente para seu app em navegadores da Web, notificações, redes sociais, anúncios e outras fontes. Os links diretos oferecem transições diretas de app para app e da Web para app que podem ajudar você a aumentar o engajamento com conteúdo contextual e segmentado.

Este guia explica como o link direto funciona e como criar e testar links diretos para seu conteúdo.

Para links diretos que fazem referência ao seu site ou domínios, recomendamos usar links de apps, que oferecem uma experiência integrada e confiável para os usuários.

Como os links diretos funcionam

O link direto é um recurso geral do sistema Android, compatível com todas as versões e em todos os dispositivos. Ele aproveita o sistema de intents do Android para direcionar links diretos para apps de interesse. Os apps que querem processar um URI de link direto específico declaram um filtro de intent correspondente nos arquivos de manifesto do app.

Durante a execução, quando o usuário toca em um link, o Android aciona uma intent e tenta roteá-la para um app. Como vários apps podem declarar filtros de intent que correspondem a um determinado URI, o Android realiza estas ações, nesta ordem, para rotear a intent:

  1. Abrir o app padrão do usuário que pode 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 de desambiguação.

Isso significa que, mesmo que os filtros de intent correspondam a um determinado URI, não há garantia de que o sistema vai encaminhar a intent de link direto para seu app. O usuário tem um papel fundamental no gerenciamento de qual app processa a intent, o que dá a ele controle e oferece escolha. Para ter mais controle sobre os links diretos para seu próprio site e domínios, use os Links do app.

A caixa de diálogo de desambiguação do Android permite que o usuário veja todos os apps instalados que se registraram para processar uma intent de link direto. O usuário também pode selecionar um app como padrão para esse tipo de link. Depois que o usuário define um padrão, o sistema não mostra mais a caixa de diálogo para essa intent específica, e o app escolhido é aberto automaticamente.

Figura 1. Caixa de diálogo de desambiguação.

O comportamento da caixa de diálogo de desambiguação evoluiu nas versões do Android. Por exemplo, no Android 12 e em versões mais recentes, os links da Web que não são Links do app verificados geralmente são abertos em um navegador da Web por padrão. Já em versões anteriores, uma caixa de diálogo de desambiguação pode ter aparecido se um app pudesse processar o link da Web.

Observação: a partir do Android 12 (nível 31 da API), uma intent da Web genérica é resolvida como uma atividade no app apenas se ele for aprovado para o domínio específico contido nessa intent. Se o app não for aprovado para o domínio, a intent da Web será resolvida no app de navegação padrão do usuário.

Tipos de links diretos

Há três tipos de links diretos que você pode usar no Android:

  • Links diretos personalizados: usam um esquema de URI personalizado (como example://products/123) para levar um usuário diretamente a um conteúdo específico em um app. Eles são úteis para navegação interna ou links de fontes controladas por você, mas não são links da Web padrão e ainda podem acionar a caixa de diálogo de desambiguação se outro app registrar o mesmo esquema personalizado.
  • Links da Web: são links diretos que usam os esquemas padrão http e https. Eles são mais versáteis porque são URLs padrão, mas no Android 12 e em versões mais recentes, quase sempre acionam a caixa de diálogo de desambiguação. Isso significa que é provável que sejam processados pelo navegador da Web do usuário por padrão, em vez de serem encaminhados para seu app.
  • Links do app: disponíveis desde o Android 6.0 (nível 23 da API), são links da Web verificados. Por um processo de associação de sites, você pode provar ao sistema Android que é proprietário do domínio. Depois da verificação, o sistema encaminha automaticamente os links desse domínio diretamente para seu app, sem passar pela caixa de diálogo de desambiguação. Isso cria uma experiência confiável e integrada para seus usuários.

Adicionar filtros de intent para links recebidos

Para criar um link para o conteúdo do seu 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 possa ser acessado na Pesquisa Google.

<data>

Adicione uma ou mais tags <data>, de modo que cada uma delas represente um formato de URI compatível com 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 são diferentes apenas 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. Essa ação é necessária para que o filtro de intent possa ser acessado de 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. Isso permite que o app responda a intents implícitas. Sem isso, a atividade só poderá ser iniciada se o 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 compatíveis com 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 a intenção é declarar URLs exclusivos (como uma combinação específica de scheme e host), porque 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 é compatível também com app://www.example.com e https://open.my.app.

Atenção: se várias atividades contiverem filtros de intent que sejam resolvidos para o mesmo link de app Android verificado, não há garantia de qual atividade processará o link.

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

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

Ler dados de intents recebidas

Depois que o sistema iniciar sua atividade por meio de um filtro de intent, você poderá usar os dados fornecidos pela Intent para determinar o que precisa ser renderizado. Chame os métodos getData() e getAction() para recuperar os dados e a ação associada à Intent de entrada. Esses métodos podem ser chamados a qualquer momento do ciclo de vida da atividade, mas geralmente precisam ser acionados durante os callbacks iniciais, como onCreate() ou onStart.

Confira um snippet que mostra como recuperar dados de um 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 deve levar os usuários diretamente ao conteúdo, sem solicitações, páginas intersticiais ou logins. Confira 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 exibir solicitações para os usuários em interações posteriores ou quando eles abrem o app na tela de início.
  • Siga as orientações de design descritas em Navegação com Voltar e Para cima para que seu 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) para testar se os URIs do filtro de intent que você especificou para links diretos direcionam para a atividade correta do app. É possível executar o comando do 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

Observação: ao definir uma coleção de tipos primitivos em uma rota, como **@Serializable data class Product(val colors: List)**, o formato de URL de link direto gerado automaticamente é **basePath?colors={value**}. Se você tentar especificar um URI com vários parâmetros de consulta (por exemplo, **basepath?colors=red&colors=blue**), será necessário escapar o e comercial (por exemplo, **basepath?colors=red\&colors=blue**).

A declaração do manifesto e o gerenciador de intents que você configurou definem a relação entre seu app e um site e o que fazer com os links recebidos. No entanto, para que o sistema trate o app como gerenciador padrão de um conjunto de URIs, é preciso solicitar também que o sistema verifique essa conexão. Verificar links de app explica como implementar essa verificação.

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