Crea vínculos directos

La vinculación directa te permite dirigir a los usuarios directamente a tu app desde navegadores web, notificaciones, redes sociales, anuncios y otras fuentes. Los vínculos directos proporcionan transiciones directas de app a app y de web a app que pueden ayudarte a aumentar la participación a través de contenido contextual y segmentado.

En esta guía, se explica cómo funciona la vinculación directa y cómo crear y probar vínculos directos a tu contenido.

En el caso de los vínculos directos que hacen referencia a tu propio sitio web o dominio, te recomendamos que uses vínculos de apps, que proporcionan una experiencia fluida y confiable para tus usuarios.

Cómo funciona la vinculación directa

La vinculación directa es una función general del sistema de Android, compatible con todas las versiones y todos los dispositivos. Aprovecha el sistema de intents de Android para enrutar los vínculos directos a las apps interesadas. Las apps que quieran controlar un URI de vínculo directo específico deben declarar un filtro de intents coincidente en sus archivos de manifiesto de la app.

En el entorno de ejecución, cuando el usuario presiona un vínculo, Android activa un intent y trata de enrutarlo a una app. Debido a que varias apps pueden declarar filtros de intents que coincidan con un URI determinado, Android realiza estas acciones, en este orden, para enrutar el intent:

  1. Abrir la app predeterminada del usuario que puede controlar el URI, si se designó una
  2. Abre la única app disponible que puede manejar el URI.
  3. Permitir que el usuario seleccione una app de un diálogo de desambiguación

Esto significa que, aunque tus filtros de intents coincidan con un URI determinado, no hay garantía de que el sistema enrute el intent de vínculo directo a tu app. El usuario tiene un rol clave en la administración de la app que controla el intent, lo que le da control y le ofrece opciones. Para tener más control sobre los vínculos directos a tu propio sitio web y tus dominios, prueba usar los vínculos de aplicación.

El diálogo de desambiguación de Android permite que el usuario vea todas las apps instaladas que se registraron para controlar un intent de vínculo directo. El usuario también puede seleccionar una app como predeterminada para este tipo de vínculo. Una vez que el usuario establece una opción predeterminada, el sistema ya no muestra el diálogo para ese intent específico, y la app elegida se abre automáticamente.

Diálogo de desambiguación del sistema Android que muestra las opciones de apps para un vínculo.
Figura 1: Diálogo de desambiguación

El comportamiento del diálogo de desambiguación evolucionó en las diferentes versiones de Android. Por ejemplo, en Android 12 y versiones posteriores, los vínculos web que no son vínculos de apps verificados, por lo general, se abrirán en un navegador web de forma predeterminada, mientras que, en versiones anteriores, es posible que haya aparecido un diálogo de desambiguación si una app podía controlar el vínculo web.

Tipos de vínculos directos

Existen tres tipos de vínculos directos que puedes admitir en Android:

  • Vínculos directos personalizados: Son vínculos directos que usan un esquema de URI personalizado (como example://products/123) para llevar a un usuario directamente a un contenido específico dentro de una app. Son potentes para la navegación interna o los vínculos de fuentes que controlas, pero no son vínculos web estándar y pueden activar el diálogo de desambiguación si otra app registra el mismo esquema personalizado.
  • Vínculos web: Son vínculos directos que usan los esquemas estándar http y https. Son más versátiles porque son URLs estándar, pero, en Android 12 y versiones posteriores, casi siempre activarán el diálogo de desambiguación, lo que significa que es probable que el navegador web del usuario las controle de forma predeterminada, en lugar de enrutarlas a tu app.
  • Vínculos de apps: Están disponibles desde Android 6.0 (nivel de API 23) y son vínculos web verificados. A través de un proceso de asociación de sitios web, puedes demostrarle al sistema Android que eres el propietario del dominio. Una vez que se verifica, el sistema enruta automáticamente los vínculos de ese dominio directamente a tu app, lo que omite por completo el diálogo de desambiguación. Esto crea una experiencia confiable y fluida para tus usuarios.

Cómo agregar filtros de intents para vínculos entrantes

Para crear un vínculo al contenido de tu app, agrega un filtro de intents que contenga estos elementos y valores de atributos en tu manifiesto:

<action>

Especifica la acción de intent ACTION_VIEW para que se pueda acceder al filtro de intents desde la Búsqueda de Google.

<data>

Agrega una o más etiquetas <data>, cada una de las cuales representa un formato de URI que se resuelve en la actividad. Como mínimo, la etiqueta <data> debe incluir el atributo android:scheme.

Puedes agregar más atributos para definir mejor el tipo de URI que acepta la actividad. Por ejemplo, es posible que tengas varias actividades que acepten URIs similares, pero que difieran según la ruta de acceso. En este caso, usa el atributo android:path o sus variantes pathPattern o pathPrefix para diferenciar qué actividad debe abrir el sistema para diferentes rutas de URI.

<category>

Incluye la categoría BROWSABLE. Es necesario para que se pueda acceder al filtro de intents desde un navegador web. Sin él, hacer clic en un vínculo en un navegador no puede resolver tu app.

También incluye la categoría DEFAULT. Esto permite que tu app responda a intents implícitos. Sin este, la actividad solo se puede iniciar si el intent especifica el nombre del componente de tu app.

En el siguiente fragmento XML, se muestra cómo puedes especificar un filtro de intents en tu manifiesto para la vinculación directa. Los URI "example://gizmos" y "http://www.example.com/gizmos" se resuelven en esta actividad.

<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>

Ten en cuenta que los dos filtros de intents solo difieren en el elemento <data>. Aunque es posible incluir varios elementos <data> en el mismo filtro, es importante que crees filtros independientes cuando tu intención sea declarar URLs únicas (como una combinación específica de scheme y host), ya que varios elementos <data> en el mismo filtro de intents se combinan para tener en cuenta todas las variaciones de sus atributos combinados. Por ejemplo, considera lo siguiente:

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

Puede parecer que esto solo admite https://www.example.com y app://open.my.app. Sin embargo, en realidad admite esos dos, además de estos: app://www.example.com y https://open.my.app.

Una vez que hayas agregado filtros de intents con URIs para el contenido de la actividad en el manifiesto de tu app, Android podrá enrutar cualquier Intent que tenga URIs coincidentes a tu app durante el tiempo de ejecución.

Para obtener más información sobre cómo definir filtros de intents, consulta Cómo permitir que otras apps inicien tu actividad.

Lee datos de intents entrantes

Una vez que el sistema inicia tu actividad a través de un filtro de intents, puedes usar los datos que proporciona el Intent para determinar lo que necesitas renderizar. Llama a los métodos getData() y getAction() para recuperar los datos y la acción asociados con el Intent entrante. Puedes llamar a estos métodos en cualquier momento del ciclo de vida de la actividad, pero generalmente debes hacerlo durante las primeras devoluciones de llamadas, como onCreate() o onStart.

Este es un fragmento que muestra cómo recuperar datos de un 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();
}

Sigue estas prácticas recomendadas para mejorar la experiencia del usuario:

  • El vínculo directo debe llevar a los usuarios directamente al contenido, sin avisos, páginas intersticiales ni registros. Asegúrate de que los usuarios puedan ver el contenido de la app incluso si nunca antes la abrieron. Puedes solicitar a los usuarios que realicen interacciones más adelante o cuando abran la app desde el Selector.
  • Sigue las instrucciones de diseño que se describen en Navegación con Atrás y Arriba para que tu app alcance las expectativas de navegación hacia atrás de los usuarios después de que ingresan a tu app mediante un vínculo directo.

Prueba tus vínculos directos

Puedes usar Android Debug Bridge con la herramienta de administrador de actividades (am) para probar que los URIs de filtro de intents que especificaste para la vinculación directa se resuelvan en la actividad correcta de la app. Puedes ejecutar el comando adb en un dispositivo o un emulador.

La sintaxis general para probar un URI de filtro de intents con adb es la siguiente:

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

Por ejemplo, el siguiente comando intenta ver una actividad de la app de destino que está asociada con el URI especificado.

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

A partir de Android 17, también puedes usar la marca --debug-link con am start para diagnosticar cómo el sistema resuelve una URL y, además, inspeccionar los filtros de intents coincidentes o las reglas de vínculos dinámicos a la app. Para obtener más información, consulta Diagnostica la resolución de vínculos con la marca debug-link.

La declaración del manifiesto y el controlador de intents que configures definen la conexión entre tu app y un sitio web, y qué hacer con los vínculos entrantes. Sin embargo, para que el sistema trate a tu app como el controlador predeterminado de un conjunto de URIs, también debes solicitar que el sistema verifique esta conexión. En Cómo verificar vínculos de apps, se explica cómo implementar esta verificación.

Para obtener más información sobre intents y vínculos de apps, consulta los siguientes recursos: