Prepárate para 12L, una actualización de funciones para pantallas grandes que se lanzará a principios del próximo año. Pruébala hoy.

Resolución de intents web

A partir de Android 12, un intent web genérico se resuelve en una actividad de la app solo si esta se aprobó para el dominio específico que se incluye en ese intent web. Si no se aprueba la app para el dominio, el intent web se resuelve en la app predeterminada del navegador del usuario.

Para que las apps obtengan esta aprobación, pueden hacer lo siguiente:

Si la app invoca intents web, considera agregar un mensaje o un diálogo que le solicite al usuario que confirme la acción.

Atributos de intents web

Un intent web es un intent con las siguientes características:

Los filtros de intents web deben incluir la categoría browsable

A partir de Android 12, los filtros de intents web también deben declarar la categoría CATEGORY_BROWSABLE para que un intent web determinado se resuelva en una actividad de la app.

Android App Links, disponible en Android 8.0 (nivel de API 26) y versiones posteriores, usa la API de vínculos de recursos digitales para asociar una app específica con un dominio web. Esta asociación le permite al sistema confiar en que el sitio web aprobó la app para abrir automáticamente los vínculos de ese dominio.

A partir de Android 12, puedes invocar la verificación del dominio de forma manual para evaluar la manera en que el sistema resuelve Android App Links.

En las apps que se orientan a Android 12, el sistema realiza varios cambios en la manera en que se verifica Android App Links. Estos cambios mejoran la confiabilidad de la experiencia de vinculación de apps y les brindan más control a los desarrolladores de apps y los usuarios finales. Puedes invocar manualmente la verificación del dominio para probar la confiabilidad de las declaraciones.

Si te orientas a Android 12 y dependes de la verificación de Android App Link para abrir vínculos web en la app, actualiza las declaraciones de Android App Links a fin de admitir los cambios en el proceso de verificación.

Actualiza declaraciones de Android App Links

El proceso de verificación del dominio requiere una conexión a Internet y podría tardar un poco en completarse. Para mejorar la eficiencia del proceso, el sistema verifica un dominio para una app que se orienta a Android 12 solo si ese dominio está dentro de un elemento <intent-filter> con un formato específico. El elemento <intent-filter> debe incluir las acciones, las categorías y los esquemas que se muestran en el siguiente fragmento:

<!-- Make sure you explicitly set android:autoVerify to "true". -->
<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />

    <!-- If a user clicks on a shared link that uses the "http" scheme, your
         app should be able to delegate that traffic to "https". -->
    <data android:scheme="http" />
    <data android:scheme="https" />

    <!-- Include one or more domains that should be verified. -->
    <data android:host="..." />
</intent-filter>

Invoca de forma manual la verificación del dominio

A partir de Android 12, puedes invocar de forma manual la verificación del dominio para una app instalada en un dispositivo. Puedes realizar este proceso independientemente de si tu app se orienta a Android 12.

Establece una conexión a Internet

Para realizar la verificación del dominio, el dispositivo de prueba debe estar conectado a Internet.

Admite el proceso actualizado de verificación del dominio

Si la app se orienta a Android 12, el sistema usará automáticamente el proceso actualizado de verificación del dominio.

De lo contrario, puedes habilitarlo de forma manual. Para ello, ejecuta el siguiente comando en una ventana de la terminal:

adb shell am compat enable 175408749 PACKAGE_NAME

Restablece el estado de Android App Links en un dispositivo

Antes de invocar de forma manual la verificación del dominio en un dispositivo, debes restablecer el estado de Android App Links en el dispositivo de prueba. Para ello, ejecuta el siguiente comando en una ventana de la terminal:

adb shell pm set-app-links --package PACKAGE_NAME 0 all

Este comando coloca el dispositivo en el mismo estado en el que se encuentra antes de que el usuario elija las apps predeterminadas para cualquier dominio.

Invoca el proceso de verificación del dominio

Después de restablecer el estado de Android App Links en un dispositivo, puedes realizar la verificación en sí. Para ello, ejecuta el siguiente comando en una ventana de la terminal:

adb shell pm verify-app-links --re-verify PACKAGE_NAME
.

Consulta los resultados de verificación

Después de esperar un poco para que el agente de verificación finalice sus solicitudes, consulta los resultados. Para ello, ejecuta el siguiente comando:

adb shell pm get-app-links PACKAGE_NAME

El resultado de este comando es similar al siguiente:

com.example.pkg:
    ID: 01234567-89ab-cdef-0123-456789abcdef
    Signatures: [***]
    Domain verification state:
      example.com: verified
      sub.example.com: legacy_failure
      example.net: verified
      example.org: 1026

Los dominios que aprueban la verificación de manera correcta tienen un estado de verificación del dominio de verified. Cualquier otro estado indica que no se pudo realizar esta verificación. En particular, el estado de none indica que es posible que el agente de verificación todavía no completó el proceso.

En la siguiente lista, se mencionan los posibles valores que puede mostrar la verificación para un dominio determinado:

none
No se registró nada para este dominio. Espera unos minutos más para que el agente de verificación termine las solicitudes relacionadas con la verificación del dominio. Luego, vuelve a invocar el proceso.
verified
Se verificó, de manera correcta, el dominio para la app que lo declara.
approved
El dominio se aprobó de manera forzosa, por lo general, mediante la ejecución de un comando de shell.
denied
El dominio se rechazó de manera forzosa, por lo general, mediante la ejecución de un comando de shell.
migrated
El sistema conserva el resultado de un proceso anterior que usó la verificación heredada del dominio.
restored
Se aprobó el dominio después de que el usuario restableció los datos. Se supone que el dominio se verificó con anterioridad.
legacy_failure
Un verificador heredado rechazó el dominio. Se desconoce el motivo específico de la falla.
system_configured
La configuración del dispositivo aprobó el dominio automáticamente.
Código de error de 1024 o superior

Es un código de error personalizado y específico del verificador del dispositivo.

Vuelve a verificar si estableciste una conexión de red y vuelve a invocar el proceso de verificación del dominio.

Solicítale al usuario que asocie la app con un dominio

Otra manera de obtener la aprobación de la app para un dominio es solicitarle al usuario que la asocie con ese dominio.

Verifica si ya se aprobó la app para el dominio

Antes de solicitarle al usuario que realice una acción, verifica si la app es el controlador predeterminado para los dominios que defines en los elementos <intent-filter>. Puedes consultar el estado de aprobación mediante uno de los siguientes métodos:

DomainVerificationManager

En el siguiente fragmento de código, se muestra cómo usar la API de DomainVerificationManager:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val manager = context.getSystemService(DomainVerificationManager::class)
val userState = manager.getDomainVerificationUserState(context.packageName)

// Domains that have passed Android App Links verification.
val verifiedDomains = userState.hostToStateMap
    .filterValues { it == DomainVerificationUserState.DOMAIN_STATE_VERIFIED }

// Domains that haven't passed Android App Links verification but that the user
// has associated with an app.
val selectedDomains = userState.hostToStateMap
    .filterValues { it == DomainVerificationUserState.DOMAIN_STATE_SELECTED }

// All other domains.
val unapprovedDomains = userState.hostToStateMap
    .filterValues { it == DomainVerificationUserState.DOMAIN_STATE_NONE }

Java

Context context = TODO("Your activity or fragment's Context");
DomainVerificationManager manager =
        context.getSystemService(DomainVerificationManager.class);
DomainVerificationUserState userState =
        manager.getDomainVerificationUserState(context.getPackageName());

Map<String, Integer> hostToStateMap = userState.getHostToStateMap();
List<String> verifiedDomains = new ArrayList<>();
List<String> selectedDomains = new ArrayList<>();
List<String> unapprovedDomains = new ArrayList<>();
for (String key : hostToStateMap.keySet()) {
    Integer stateValue = hostToStateMap.get(key);
    if (stateValue == DomainVerificationUserState.DOMAIN_STATE_VERIFIED) {
        // Domain has passed Android App Links verification.
        verifiedDomains.add(key);
    } else if (stateValue == DomainVerificationUserState.DOMAIN_STATE_SELECTED) {
        // Domain hasn't passed Android App Links verification, but the user has
        // associated it with an app.
        selectedDomains.add(key);
    } else {
        // All other domains.
        unapprovedDomains.add(key);
    }
}

Programa de línea de comandos

Cuando pruebes la app durante el desarrollo, puedes ejecutar el siguiente comando para consultar el estado de verificación de los dominios que posee la organización:

adb shell pm get-app-links --user cur PACKAGE_NAME

En el siguiente resultado de ejemplo, a pesar de que la app no aprobó la verificación del dominio "example.org", el usuario 0 aprobó de forma manual la app en la configuración del sistema, y no se verificó ningún otro paquete para ese dominio.

com.example.pkg:
ID: ***
Signatures: [***]
Domain verification state:
  example.com: verified
  example.net: verified
  example.org: 1026
User 0:
  Verification link handling allowed: true
  Selection state:
    Enabled:
      example.org
    Disabled:
      example.com
      example.net

Brinda contexto para la solicitud

Antes de realizar esta solicitud para aprobar el dominio, bríndale contexto al usuario. Por ejemplo, puedes mostrarle una pantalla de presentación, un diálogo o un elemento de la IU similar que le explique al usuario por qué la app debería ser el controlador predeterminado para un dominio particular.

Realiza la solicitud

Una vez que el usuario comprenda lo que la app le solicita que haga, realiza la solicitud. Para hacerlo, invoca un intent que incluya la acción de intent ACTION_APP_OPEN_BY_DEFAULT_SETTINGS y una string de datos que coincida con package:com.example.pkg para la app de destino, como se muestra en el siguiente fragmento de código:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val intent = Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:${context.packageName}"))
context.startActivity(intent)

Java

Context context = TODO("Your activity or fragment's Context");
Intent intent = new Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package: " + context.getPackageName()));
context.startActivity(intent);

Cuando se invoca el intent, los usuarios ven la pantalla de configuración Abrir de forma predeterminada. En esta pantalla, se incluye el botón de selección Abrir vínculos admitidos, como se muestra en la figura 1.

Cuando el usuario activa Abrir vínculos admitidos, aparece un conjunto de casillas en la sección Vínculos que se pueden abrir en esta app, en donde los usuarios pueden seleccionar los dominios que desean asociar con la app. También, pueden seleccionar Agregar vínculo para añadir dominios, como se muestra en la figura 2. Después, cuando los usuarios seleccionen cualquier vínculo dentro de los dominios que agreguen, este se abrirá automáticamente en la app.

Cuando el botón de selección está habilitado, una sección cerca de la parte inferior incluye casillas y el botón &quot;Agregar vínculo&quot;.
Figura 1: Pantalla de configuración del sistema, en la que los usuarios pueden elegir qué vínculos se abren en la app de forma predeterminada.
Cada casilla representa un dominio que puedes agregar. Los botones del diálogo son &quot;Cancelar&quot; y &quot;Agregar&quot;.
Figura 2: Diálogo en el que los usuarios pueden elegir dominios adicionales para asociarlos con la app.

Activa o desactiva de forma manual la aprobación del dominio

Tanto la verificación del dominio como la selección del usuario se pueden activar o desactivar mediante comandos de shell, que le permiten a un desarrollador configurar de forma manual el estado correcto para depurar, para ejecutar pruebas o para otros casos (como la falta de conexión a Internet).

Puedes encontrar una explicación completa de estos comandos en el resultado de adb shell pm.

Ten en cuenta que se aplican todas las mismas restricciones de aprobación única y prioridad verificada, incluso cuando se aprueban mediante comandos de shell. Por este motivo, en algunos casos especiales, por ejemplo, la instalación simultánea de dos variantes de apps, se requiere un control especial para abrir un vínculo web determinado en la app que deseas usar.

Varias apps verificadas

Si publicas varias apps asociadas con el mismo dominio, cada una puede verificarse de manera correcta. Sin embargo, si las apps pueden resolver exactamente el mismo host del dominio y la misma ruta de acceso, como puede suceder con las versiones básica y completa de una app, solo la última que se instaló puede resolver intents web para ese dominio.

En un caso como este, verifica si es posible que, en el dispositivo del usuario, existan apps en conflicto, siempre que cuentes con la visibilidad del paquete necesaria. Luego, en la app, muestra un diálogo personalizado del selector que incluya los resultados de las llamadas a queryIntentActivities(). El usuario puede seleccionar su app preferida de la lista de apps que coinciden y aparecen en el diálogo.

.

Abre dominios de la app que no se pueden verificar

Es posible que la función principal de la app sea abrir vínculos como un tercero, sin la capacidad de verificar sus dominios controlados. Si este es el caso, explícales a los usuarios que, en el momento en que seleccionen un vínculo web, no podrán elegir entre una app propia y tu app (de terceros). Los usuarios deben asociar de forma manual los dominios con la app de terceros.

Además, considera introducir un diálogo o una actividad de trampolín que le permita al usuario abrir el vínculo en la app propia si prefiere hacerlo, como un proxy. Antes de configurar un diálogo o una actividad de trampolín, configura la app para que tenga visibilidad del paquete en las apps propias que coincidan con el filtro de intents web de tu app.