¡Te damos la bienvenida a la Vista previa para desarrolladores de Android 12! Envíanos comentarios con frecuencia y tan pronto como puedas, y ayúdanos a hacer de Android 12 la mejor versión hasta el momento.

Cambios de comportamiento: todas las apps

La plataforma de Android 12 incluye cambios de comportamiento que podrían afectar a tu app. Los siguientes cambios se aplican a todas las apps cuando se ejecutan en Android 12, independientemente de la targetSdkVersion. Debes probar tu app y, luego, modificarla según corresponda para admitir estos cambios.

Asegúrate también de revisar la lista de cambios de comportamiento que solo afectan a las apps orientadas a Android 12.

Experiencia del usuario

Mejoras en el modo envolvente para la navegación por gestos

Android 12 simplifica el modo envolvente para facilitar la navegación por gestos y mantener la coherencia con el resto de la experiencia de actividades, como mirar un video y leer un libro. Las apps pueden protegerse de los gestos accidentales en las experiencias de juego de pantalla completa, de manera que los usuarios no salgan accidentalmente de las apps durante una partida. Todas las demás experiencias envolventes en pantalla completa ahora permiten a los usuarios navegar por su teléfono con solo deslizar el dedo.

A fin de lograr esto, los comportamientos existentes para experiencias envolventes no fijas (BEHAVIOR_SHOW_BARS_BY_TOUCH, BEHAVIOR_SHOW_BARS_BY_SWIPE) dejaron de estar disponibles a partir de Android 12. Se reemplazaron por el comportamiento predeterminado (BEHAVIOR_DEFAULT) que permite gestos con un deslizamiento cuando oculta las barras del sistema. Esta marca muestra diferentes comportamientos visuales y funcionales según el modo:

  • En el modo de tres botones, el comportamiento visual y funcional es el mismo que el modo envolvente en versiones anteriores a Android 12.
  • En el modo de navegación por gestos, el comportamiento es el siguiente:
    • Visualmente, es lo mismo que el modo envolvente en Android 11 y versiones anteriores.
    • En cuanto a la funcionalidad, se permiten los gestos incluso cuando la barra está oculta, el sistema requiere solo un deslizamiento para invocar elementos en lugar de los dos deslizamientos que se necesitan con Android 11. No se requieren deslizamientos adicionales para bajar la barra de notificaciones o ir a la página principal.

El modo envolvente fijo (BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) no cambió en Android 12. Ten en cuenta la siguiente retrocompatibilidad con esta función:

  • Apps que se ejecutan en Android 12 y están orientadas a Android 11 y versiones anteriores:
    • BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE se comporta de la misma manera en cuanto a lo visual y lo funcional.
    • La configuración predeterminada se mapea a BEHAVIOR_SHOW_BARS_BY_SWIPE.
  • Apps que se ejecutan en Android 11 (nivel de API 30) y versiones anteriores que se orientan a Android 12:

Demora en notificaciones del servicio en primer plano

A fin de proporcionar una experiencia optimizada para los servicios en primer plano de ejecución breve en Android 12, el sistema puede demorar 10 segundos la visualización de las notificaciones de determinados servicios en primer plano. Este cambio permite que se completen las tareas de corta duración antes de que aparezcan sus notificaciones.

Si un servicio en primer plano tiene al menos una de las siguientes características, el sistema muestra la notificación asociada inmediatamente después de que se inicia el servicio:

  • El servicio está asociado con una notificación que incluye botones de acción.
  • El servicio tiene un foregroundServiceType de connectedDevice, mediaPlayback, mediaProjection o phoneCall.
  • El servicio proporciona un caso de uso relacionado con las llamadas telefónicas, la navegación o la reproducción multimedia, como se define en el atributo de categoría de la notificación.

  • El servicio inhabilitó el cambio de comportamiento mediante una llamada a setShowForegroundImmediately() cuando configuró la notificación.

Privacidad

Restricciones en la dirección MAC de Netlink

Android 12 restringe aún más el acceso a la dirección MAC de un dispositivo, un identificador que no se puede restablecer, para todas las apps que no son del sistema, independientemente del nivel de la API de destino.

Las API relacionadas muestran valores vacíos o de marcadores de posición, según la versión del SDK de destino de la app:

  • Si tu app está orientada a Android 12, la API muestra un valor nulo.
  • Si tu app está orientada a Android 11 o versiones anteriores, la API muestra un valor de marcador de posición hard-coded: 02:00:00:00:00:00

Los desarrolladores deben usar ConnectivityManager en lugar de APIs de nivel inferior como NetworkInterface, getifaddrs() o sockets de Netlink. Cuando un desarrollador llama a NetworkInterface.getHardwareAddress() en su código, el resultado de logcat muestra lo siguiente: CompatibilityChangeReporter: Compat change id reported: 170188668;

Los desarrolladores pueden usar la marca de compatibilidad llamada RETURN_NULL_HARDWARE_ADDRESS para activar o desactivar el comportamiento de NetworkInterface.getHardwareAddress() a fin de mostrar un valor nulo cuando esté habilitado o 02:00:00:00:00:00 cuando esté inhabilitado.

Seguridad

Bloqueo de los eventos táctiles que no son de confianza

Con el objetivo de preservar la seguridad del sistema y una buena experiencia del usuario, Android 12 evita que las apps consuman eventos táctiles, en los que una superposición oculta la app de forma insegura. En otras palabras, el sistema bloquea los toques que pasan por determinadas ventanas, con algunas excepciones.

Apps afectadas

Este cambio afecta a las apps que permiten que los toques pasen por sus ventanas, por ejemplo, mediante la marca FLAG_NOT_TOUCHABLE. Entre los ejemplos, se incluyen los siguientes:

Excepciones

En los siguientes casos, se permiten los toques "de paso":

  • Interacciones dentro de tu app. La app muestra la superposición, y la superposición solo aparece cuando el usuario interactúa con la app.
  • Ventanas de confianza. Entre los ejemplos de estas ventanas, se incluyen los siguientes:

  • Ventanas invisibles. La vista raíz de la ventana es GONE o INVISIBLE.

  • Ventanas totalmente transparentes. La propiedad alpha es 0.0 para la ventana.

  • Ventanas de alerta de sistema lo suficientemente traslúcidas. El sistema considera que un conjunto de ventanas de alerta del sistema es lo suficientemente translúcido cuando la opacidad combinada es menor o igual que la opacidad máxima oculta del sistema para los toques. En la Vista previa para desarrolladores 1, esta opacidad máxima es de 0.8, pero este valor puede cambiar en un futuro en la Vista previa para desarrolladores.

Detecta si se bloquea un toque no confiable

Si el sistema bloquea una acción táctil, Logcat registra el siguiente mensaje:

Untrusted touch due to occlusion by PACKAGE_NAME

Prueba el cambio

Los toques no confiables se bloquean de manera predeterminada en dispositivos que ejecutan la Vista previa para desarrolladores 1 de Android 12. Para permitir toques no confiables, ejecuta el siguiente comando de ADB en una ventana de terminal:

# A specific app
adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.app

# All apps
# If you'd still like to see a Logcat message warning when a touch would be
# blocked, use 1 instead of 0.
adb shell settings put global block_untrusted_touches 0

Para revertir el comportamiento al valor predeterminado (en el que se bloquean los toques no confiables), ejecuta el siguiente comando:

# A specific app
adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.app

# All apps
adb shell settings put global block_untrusted_touches 2

Las apps no pueden cerrar los diálogos del sistema

Para mejorar el control del usuario cuando interactúa con apps y el sistema, la acción de intent ACTION_CLOSE_SYSTEM_DIALOGS deja de estar disponible a partir de Android 12. A excepción de algunos casos especiales, cuando tu app intenta invocar un intent que contiene esta acción, el sistema realiza una de las siguientes acciones según la versión del SDK de destino de la app:

  • Si la app se orienta a Android 12, se genera una SecurityException.
  • Si la app se orienta a Android 11 (nivel de API 30) o versiones anteriores, el intent no se ejecuta y aparece el siguiente mensaje en Logcat:

    E ActivityTaskManager Permission Denial: \
    android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from \
    com.package.name requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, \
    dropping broadcast.
    

Excepciones

En los siguientes casos, una app aún puede cerrar diálogos del sistema en Android 12:

  • La app ejecuta una prueba de instrumentación.
  • La app se orienta a Android 11 o versiones anteriores y muestra una ventana ubicada en el panel lateral de notificaciones.

  • La app se orienta a Android 11 o una versión anterior. Además, el usuario interactuó con una notificación, probablemente con los botones de acción de la notificación, y tu app procesa un servicio o receptor de emisión en respuesta a esa acción del usuario.

Restricciones en interfaces no SDK

Android 12 incluye listas actualizadas de este tipo de interfaces que están basadas en la colaboración con desarrolladores de Android y las pruebas internas más recientes. Siempre que sea posible, nos aseguramos de que las alternativas públicas estén disponibles antes de restringir las interfaces que no pertenecen al SDK.

Si tu app no está orientada a Android 12, es posible que algunos de estos cambios no te afecten de inmediato. Sin embargo, aunque actualmente puedes usar algunas interfaces que no pertenecen al SDK (según el nivel de API al que esté orientada la app), utilizar cualquier método o campo que no pertenezca al SDK siempre implica un gran riesgo de error para tu app.

En caso de no saber con certeza si tu app usa este tipo de interfaces, puedes probarla para verificarlo. Si tu app depende de interfaces que no pertenezcan al SDK, deberías planificar una migración hacia otras alternativas que sí lo hagan. Sin embargo, sabemos que algunas apps tienen casos prácticos válidos para usarlas. Si no encuentras una alternativa al uso de una interfaz que no pertenece al SDK para una función de tu app, deberías solicitar una nueva API pública.

Para obtener más información sobre los cambios implementados en esta versión de Android, consulta Actualizaciones a las restricciones de interfaces que no pertenecen al SDK en Android 12. Para obtener más información sobre interfaces que no pertenecen al SDK en general, consulta Restricciones en interfaces que no pertenecen al SDK.