Android 9 (nivel de API 28) presenta características y capacidades nuevas para usuarios y desarrolladores. En este documento, se destacan las novedades para desarrolladores.
Para obtener más información sobre las API nuevas, lee el informe de diferencias de las API o consulta la referencia de Android API. Asegúrate de revisar los cambios de comportamiento en Android 9 para obtener información sobre las áreas en las cuales los cambios en la plataforma pueden afectar tus apps.
Posicionamiento en interiores con RTT de Wi-Fi

Android 9 suma una plataforma compatible con el protocolo de Wi-Fi IEEE 802.11mc, también conocido como tiempo de ida y vuelta de Wi-Fi (RTT), para que puedas aprovechar el posicionamiento en interiores en tus apps.
En los dispositivos con Android 9 que dispongan del hardware correspondiente, tus apps podrán usar
RTT API para medir la distancia
a los puntos de acceso (PA) WiFi cercanos con capacidad para RTT. El dispositivo debe tener
los servicios de ubicación habilitados y el escaneo de Wi-Fi activado (en
Settings > Location), y tu app debe tener el permiso
ACCESS_FINE_LOCATION
. No es necesario que el dispositivo se conecte a los puntos de acceso para usar el RTT.
Para preservar la privacidad, solo el teléfono puede determinar la distancia hasta el
punto de acceso; los puntos de acceso no tienen esta información.
Si tu dispositivo mide la distancia a 3 o más puntos de acceso, puedes usar un algoritmo de multilateración para calcular la posición del dispositivo que mejor se adecue a esas medidas. La precisión del resultado generalmente va de 1 a 2 metros.
Con esta precisión, puedes crear nuevas experiencias; por ejemplo, navegación en instalaciones y servicios específicos basados en la ubicación, como el control de voz inequívoco (por ejemplo, “Encender esta luz”) e información basada en la ubicación (por ejemplo, “¿Hay ofertas especiales relacionadas con este producto?”).
Compatibilidad con recorte de pantalla

Prueba de recorte de pantalla con el emulador
Android 9 ofrece compatibilidad con las últimas pantallas de borde a borde
que contienen recortes de pantalla para cámaras y altavoces. La clase
DisplayCutout
te permite encontrar la ubicación y la forma de las áreas no funcionales donde
no se debe mostrar el contenido. Para determinar la existencia y la ubicación de
estas áreas de recortes, usa el método
getDisplayCutout()
.
Un atributo nuevo de diseño de ventana,
layoutInDisplayCutoutMode
,
permite que tu app muestre su contenido en los recortes de un dispositivo. Puedes fijar
este atributo en uno de los siguientes valores:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
Puedes simular un recorte de pantalla en cualquier dispositivo o emulador que tenga Android 9 de la siguiente manera:
- Habilita las opciones para desarrollador.
- En la pantalla Developer options, desplázate hacia abajo hasta la sección Drawing y selecciona Simulate a display with a cutout.
- Selecciona el tamaño del recorte.
Nota: Te recomendamos probar la visualización del contenido en el área de recorte mediante un dispositivo o emulador con Android 9.
Notificaciones
Android 9 introduce varias mejoras a las notificaciones, y todas están disponibles para los desarrolladores que apunten a niveles de API a partir del 28.

MessagingStyle con foto adjunta.

MessagingStyle con respuestas y conversación.
Experiencia de mensajería mejorada
A partir de Android 7.0 (nivel de API 24), era posible agregar una acción para responder a los mensajes o ingresar otro texto directamente desde una notificación. En Android 9, esta característica se mejora con las siguientes optimizaciones:
Compatibilidad simplificada con participantes de conversaciones: la clase
Person
se usa para identificar a la gente que participa en una conversación, incluidos sus avatares y URI. Muchas otras API, comoaddMessage()
, ahora pueden aprovechar la clasePerson
en lugar de usar unaCharSequence
. La clasePerson
también admite el patrón de diseño Builder.Compatibilidad con imágenes: Android 9 ahora muestra imágenes en las notificaciones del Centro de Mensajes de los teléfonos. Te recomendamos usar
setData()
en el mensaje para mostrar una imagen. En el siguiente fragmento de código se demuestra la manera de crear unaPerson
y un mensaje que contenga una imagen.
Kotlin
// Create new Person. val sender = Person() .setName(name) .setUri(uri) .setIcon(null) .build() // Create image message. val message = Message("Picture", time, sender) .setData("image/", imageUri) val style = Notification.MessagingStyle(getUser()) .addMessage("Check this out!", 0, sender) .addMessage(message)
Java
// Create new Person. Person sender = new Person() .setName(name) .setUri(uri) .setIcon(null) .build(); // Create image message. Message message = new Message("Picture", time, sender) .setData("image/", imageUri); Notification.MessagingStyle style = new Notification.MessagingStyle(getUser()) .addMessage("Check this out!", 0, sender) .addMessage(message);
Guardado de respuestas como borradores: tu app puede obtener el
EXTRA_REMOTE_INPUT_DRAFT
enviado al sistema cuando un usuario accidentalmente cierra una notificación de mensajería. Puedes usar este elemento adicional para completar previamente los campos de texto de la app, a fin de que los usuarios puedan terminar sus respuestas.Identificación de conversaciones grupales: Puedes usar
setGroupConversation()
para identificar, de manera deliberada, una conversación como grupal o no grupal.Configuración de la acción semántica para un intent: El método
setSemanticAction()
te permite dar significado semántico a una acción; entre otros, “marcar como leído”, “borrar” y “responder”.SmartReply: Android 9 es compatible con las mismas respuestas sugeridas que se encuentran disponibles en tu app de mensajería. Usa
RemoteInput.setChoices()
para proporcionar una matriz de respuestas estándares al usuario.
Configuraciones de canales, transmisiones y el modo No interrumpir
Android 8.0 presentó los canales de notificaciones; estos te permiten crear un canal que el usuario puede personalizar para cada tipo de notificación que desees mostrar. Android 9 simplifica las configuraciones del canal de notificaciones con estos cambios:
Bloqueo de grupos de canales: los usuarios ahora pueden bloquear grupos de canales completos dentro de la configuración de notificaciones de una app. Puedes usar el método
isBlocked()
para identificar bloqueos de grupos y, en consecuencia, no enviar notificaciones para canales de ese grupo.Además, tu app puede consultar las configuraciones de grupos de canales actuales con el método nuevo
getNotificationChannelGroup()
.Tipos de intents de transmisión nuevos: el sistema de Android envía intents de transmisión cuando se producen cambios en el estado de bloqueo de los canales de notificación y los grupos de canales. La app a la que pertenece el canal o el grupo bloqueado puede detectar estas intents y reaccionar de manera apropiada. Para obtener más información sobre las acciones y los elementos adicionales de estas intents, consulta la lista de constantes actualizados en la referencia de
NotificationManager
. Para obtener información sobre cómo reaccionar ante las intents de transmisión, consulta Transmisiones.NotificationManager.Policy
tiene tres categorías nuevas de prioridad para No molestar.PRIORITY_CATEGORY_ALARMS
prioriza alarmas.PRIORITY_CATEGORY_MEDIA
prioriza sonidos de medios, como la navegación multimedia y por voz.PRIORITY_CATEGORY_SYSTEM
prioriza sonidos del sistema.
NotificationManager.Policy
también tiene siete constantes nuevas para No molestar que puedes usar para eliminar la interrupción visual:SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
evita que la notificación inicie una actividad en pantalla completa.SUPPRESSED_EFFECT_LIGHTS
bloquea las luces de notificación.SUPPRESSED_EFFECT_PEEK
evita que las notificaciones aparezcan brevemente en la vista (“asomen”).SUPPRESSED_EFFECT_STATUS_BAR
evita que las notificaciones aparezcan en la barra de estado en dispositivos que admiten barras de estado.SUPPRESSED_EFFECT_BADGE
bloquea insignias en dispositivos que admiten insignias. Para obtener más información, consulta Modificar la insignia de una notificación.SUPPRESSED_EFFECT_AMBIENT
bloquea las notificaciones en dispositivos que admiten pantallas en modo ambiente.SUPPRESSED_EFFECT_NOTIFICATION_LIST
evita que las notificaciones aparezcan en la vista de lista en dispositivos que admiten una vista de lista, como el panel de notificaciones o la pantalla de bloqueo.
Compatibilidad con varias cámaras y actualizaciones de cámaras
En dispositivos con Android 9, puedes acceder de forma simultánea a transmisiones de dos o más cámaras físicas. En dispositivos con dos cámaras frontales o posteriores, puedes crear características innovadoras que no serían posibles con una sola cámara, como el zoom uniforme, el bokeh y la visión estéreo. La API también permite llamar a una transmisión de cámara lógica o fusionada que automáticamente alterna entre dos o más cámaras.
Entre otras mejoras en la cámara, se incluyen parámetros de sesión adicionales que ayudan a reducir demoras durante la captura inicial, y el uso compartido en Surface, que permite a los clientes de la cámara manejar varios casos de uso sin necesidad de detener e iniciar la transmisión de esta. También agregamos API para brindar compatibilidad con flash basada en la pantalla y acceso a marcas de tiempo OIS para lograr estabilidad en la imagen y efectos especiales en el nivel de la app.
En Android 9, la multi-camera
API
admite cámaras monocromáticas para dispositivos compatibles con
FULL
o
LIMITED
.
La salida monocromática se logra mediante el formato
YUV_420_888
con Y como escala de grises, U (Cb) como 128, y V (Cr) como 128.
Android 9 también habilita la asistencia para cámaras externas USB y UVC en dispositivos compatibles.
ImageDecoder para elementos de diseño y mapas de bits
Android 9 introduce la clase
ImageDecoder
que proporciona un enfoque modernizado para la decodificación de imágenes. Utiliza esta clase
en lugar de las API BitmapFactory
y BitmapFactory.Options
.
ImageDecoder
te permite crear un
Drawable
o un
Bitmap
a partir de un búfer de bytes, un archivo
o un URI. Para decodificar una imagen, primero llama a
createSource()
con la fuente de la imagen codificada. Luego, llama a
decodeDrawable()
o decodeBitmap()
pasando el objeto ImageDecoder.Source
para crear un Drawable
] o un Bitmap
. Para cambiar
la configuración predeterminada, pasa OnHeaderDecodedListener
a
decodeDrawable()
o decodeBitmap()
. ImageDecoder
llama a
onHeaderDecoded()
con el alto y el ancho predeterminado de la imagen, una vez que los conozcas.
Si la imagen codificada es de formato GIF o WebP animado, decodeDrawable()
muestra un
Drawable
que es una instancia de la clase
AnimatedImageDrawable
.
Existen métodos diferentes que puedes usar para fijar las propiedades de imagen:
- Para aplicar un ajuste a escala de la imagen decodificada a un tamaño exacto, pasa las dimensiones de destino a
setTargetSize()
. También puedes aplicar ajustes a escala a las imágenes usando un tamaño de muestra. Pasa el tamaño de muestra directamente asetTargetSampleSize()
. - Para recortar una imagen dentro del rango de la imagen ajustada a escala, llama a
setCrop()
. - Para crear un mapa de bits mutable, pasa
true
asetMutableRequired()
.
ImageDecoder
también te permite agregar efectos personalizados y complejos a una imagen,
como esquinas redondeadas o
máscaras circulares. Usa
setPostProcessor()
con una instancia de la clase
PostProcessor
para ejecutar los comandos de dibujos que desees.
Nota: Cuando posprocesas un
AnimatedImageDrawable
,
los efectos aparecen en todos los marcos de la animación.
Animación
Android 9 introduce la clase
AnimatedImageDrawable
para dibujar y mostrar imágenes animadas GIF y WebP.
AnimatedImageDrawable
funciona de manera similar a
AnimatedVectorDrawable
en cuanto a que el subproceso de representación impulsa las animaciones de AnimatedImageDrawable
.
El subproceso de representación usa también un subproceso de trabajo para decodificar, de modo que la decodificación no
interfiera con otras operaciones en el subproceso de representación. Esta implementación permite que
tu app muestre una imagen animada sin administrar sus actualizaciones ni
interferir con otros eventos en el subproceso de la IU de tu app.
Se puede decodificar un AnimatedImageDrawable
usando una instancia de
ImageDecoder
. En el siguiente
fragmento de código se muestra la manera de usar ImageDecoder
para decodificar tu
AnimatedImageDrawable
:
Kotlin
@Throws(IOException::class) private fun decodeImage() { val decodedAnimation = ImageDecoder.decodeDrawable( ImageDecoder.createSource(resources, R.drawable.my_drawable)) // Prior to start(), the first frame is displayed. (decodedAnimation as? AnimatedImageDrawable)?.start() }
Java
private void decodeImage() throws IOException { Drawable decodedAnimation = ImageDecoder.decodeDrawable( ImageDecoder.createSource(getResources(), R.drawable.my_drawable)); if (decodedAnimation instanceof AnimatedImageDrawable) { // Prior to start(), the first frame is displayed. ((AnimatedImageDrawable) decodedAnimation).start(); } }
ImageDecoder
tiene varios métodos que te permiten aplicar más modificaciones a la imagen.
Por ejemplo, puedes usar el método
setPostProcessor()
para modificar la apariencia de la imagen; por ejemplo, aplicar una máscara circular o
esquinas redondeadas.
Video HDR VP9, compresión de imagen HEIF y API de medios
Android 9 incorpora compatibilidad integrada con rango dinámico alto (HDR) VP9 Perfil 2 para que ahora puedas ofrecer películas en HDR a tus usuarios en YouTube, Play Movies y otros recursos en dispositivos que admitan HDR.
En Android 9 se agrega compatibilidad con codificación de imágenes HEIF (heic) a la plataforma. Las muestras de imágenes HEIF estáticas se admiten en las clases MediaMuxer
y MediaExtractor
. El formato
HEIF mejora la compresión para el guardado en un medio de almacenamiento y datos de red. Con dispositivos Android 9 compatibles con la plataforma, enviar y utilizar imágenes HEIF desde tus servidores backend es fácil. Una vez que te asegures de que tu app sea compatible con este formato de datos para compartir y mostrar contenido, prueba el HEIF como formato de almacenamiento de imágenes en tu app. Puedes realizar una conversión de jpeg a heic usando ImageDecoder o BitmapFactory para obtener un mapa de bits a partir de jpeg, y usar HeifWriter para escribir imágenes HEIF estáticas desde el búfer de bytes YUV, Surface o un mapa de bits.
Las métricas de medios también se encuentran disponibles en las clases AudioTrack
, AudioRecord
y MediaDrm
.
En Android 9 se agregan métodos a la clase
MediaDRM
para obtener métricas, niveles de HDCP
, niveles de seguridad y varias sesiones, agregar más control a los
niveles de seguridad y ofrecer seguridad en las detenciones. Para obtener más información, consulta el informe de diferencias de API.
En Android 9, la AAudio API incluye
atributos AAudioStream para
uso,
tipo de contenido,
y valores de entrada preestablecidos.
Con estos atributos, podrás
crear transmisiones adaptadas para aplicaciones de VoIP o videocámara. También puedes configurar el
SessionID
para asociar una transmisión AAudio con una submezcla que puede incluir efectos. Usa
AudioEffect API
para controlar los efectos.
Android 9 incluye una API AudioEffect para DynamicsProcessing. Con esta clase puedes compilar efectos de audio basados en canales compuestos por varias etapas de diferentes tipos, entre las que se incluyen la ecualización, la compresión multibanda y el limitador. La cantidad de bandas y etapas creativas puede configurarse, y la mayoría de los parámetros pueden controlarse en tiempo real.
Sensibilidad al costo de datos en JobScheduler
A partir de Android 9, JobScheduler
puede usar las señales de estado de red proporcionadas por los proveedores para mejorar el manejo de
trabajos relacionados con la red.
Las tareas pueden declarar el tamaño estimado de los datos, la búsqueda anticipada de señal, y especificar
requisitos de red detallados. JobScheduler
luego administra el trabajo de acuerdo con
el estado de la red. Por ejemplo, cuando la red indique que está congestionada,
JobScheduler
podría diferir las solicitudes de red de gran magnitud. Cuando una red es
no medida, JobScheduler
puede ejecutar trabajos de captura previa para
mejorar la experiencia del usuario, como la captura previa de encabezados.
Al agregar trabajos, asegúrate de usar setEstimatedNetworkBytes()
,
setPrefetch()
y setRequiredNetwork()
cuando corresponda para ayudar a
JobScheduler
a manejar la tarea de forma apropiada. Cuando se ejecute tu trabajo,
asegúrate de usar el objeto Network
que
muestre
JobParameters.getNetwork()
.
De lo contrario, implícitamente usarás la red predeterminada del dispositivo, que
podría incumplir con tus requisitos y hacer que se usen datos de manera no intencionada.
Neural Networks API 1.1
La Neural Networks API se presentó en Android 8.1 (nivel de API 27) para acelerar el aprendizaje automático en Android. Android 9 expande y mejora la API, agregando asistencia para nueve operaciones nuevas:
- Operaciones matemáticas en elementos:
- Operaciones de matrices:
Problema conocido: Al pasar
ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
tensores a la operación
ANEURALNETWORKS_PAD
, disponible en Android 9 y versiones posteriores,
es posible que el resultado de NNAPI no coincida con el resultado de los marcos de trabajo
de aprendizaje automático de nivel superior, como
TensorFlow Lite. En su lugar,
solo debes pasar
ANEURALNETWORKS_TENSOR_FLOAT32
hasta que se resuelva el problema.
Además, la API también introduce una función nueva,
ANeuralNetworksModel_relaxComputationFloat32toFloat16()
,
que te permite especificar si deseas calcular
ANEURALNETWORKS_TENSOR_FLOAT32
con un rango de precisión tan bajo como el del formato de punto flotante IEEE 754
de 16 bits.
Autofill Framework
En Android 9, se introducen varias mejoras que los servicios de autocompletar pueden implementar para mejorar aún más la experiencia del usuario al completar formularios. Para obtener más información sobre cómo usar características de autocompletado en tu app, consulta la guía de Autofill Framework.
Mejoras de seguridad
En Android 9, se incluyen varias características de seguridad que se resumen en las siguientes secciones:
Confirmación de protección de Android
Los dispositivos compatibles que tienen Android 9 o versiones posteriores te permiten usar la confirmación de protección de Android. Cuando se usa este flujo de trabajo, tu app muestra un aviso al usuario en el que se le solicita aprobar una declaración corta. Esta declaración permite a la app ratificar que el usuario desea completar una transacción confidencial, como un pago.
Si el usuario acepta la declaración, Android Keystore recibe y guarda una
firma criptográfica protegida por un código de autenticación de mensajes de hash con
clave (HMAC). Después de que Android Keystore confirma la validez del mensaje, tu app
puede usar la clave generada por trustedConfirmationRequired
en el entorno
de ejecución seguro (TEE) para firmar el mensaje que el usuario aceptó. La
firma indica, con un alto grado de confianza, que el usuario vio la declaración
y la aceptó.
Advertencia: La confirmación de protección de Android no proporciona un canal de información seguro para el usuario. Tu app no podrá prever ninguna garantía de confidencialidad más allá de las que ofrece la plataforma Android. En especial, no uses este flujo de trabajo para mostrar información confidencial que no mostrarías normalmente en el dispositivo del usuario.
Para obtener orientación sobre cómo agregar compatibilidad con la confirmación de protección de Android, consulta la guía Confirmación de protección de Android .
Diálogo de autenticación biométrica unificada
En Android 9, el sistema proporciona diálogos de autenticación biométrica en representación de tu app. Esta característica crea una apariencia y ubicación estandarizadas para el diálogo, lo que brinda a los usuarios mayor confianza de que la autenticación se realiza con un verificador de credenciales biométrico.
Si tu app usa
FingerprintManager
para mostrar un diálogo de autenticación por huellas dactilares a los usuarios, usa en su lugar
BiometricPrompt
. BiometricPrompt
depende del sistema para mostrar el diálogo
de autenticación. También cambia su conducta para adaptarse al tipo de autenticación
biométrica que el usuario eligió.
Nota: Antes de aplicar BiometricPrompt
en tu app, debes usar primero el método
hasSystemFeature()
para asegurarte de que el dispositivo admita FEATURE_FINGERPRINT
, FEATURE_IRIS
o FEATURE_FACE
. Si un dispositivo no admite la autenticación biométrica, puedes
recurrir a la verificación del PIN, el patrón o la contraseña de un usuario con el método
createConfirmDeviceCredentialIntent()
.
Módulo de seguridad de hardware
Los dispositivos admitidos con Android 9 instalado, o versiones posteriores, pueden tener un StrongBox Keymaster, una implementación del Keymaster HAL que reside en un módulo de seguridad de hardware. El módulo contiene lo siguiente:
- Su propia CPU.
- Almacenamiento seguro.
- Un generador de números aleatorios reales.
- Mecanismos adicionales de resistencia contra alteraciones de paquetes e instalaciones de prueba no autorizadas de apps.
Cuando se verifican las claves almacenadas en el StrongBox Keymaster, el sistema corrobora la integridad de una clave con el entorno de ejecución seguro (TEE).
Para obtener más información sobre el uso de Strongbox Keymaster, consulta el Módulo de seguridad de hardware.
Importar claves al Keystore de forma segura
Android 9 proporciona seguridad adicional en la desencriptación de claves, ya que agrega la capacidad de importar claves encriptadas de forma segura al Keystore, usando un formato de clave con codificación ASN.1‑. El Keymaster luego descifra las claves en el Keystore, para que el contenido de estas nunca aparezca como texto sin formato en la memoria host del dispositivo.
Nota: Esta característica se admite únicamente en los dispositivos que incorporan Keymaster 4 o una versión posterior.
Obtén más información sobre cómo importar claves encriptadas de forma más segura.
Esquema de firma de APK con rotación de claves
En Android 9 se incluye compatibilidad con el esquema de firma de APK v3. Este esquema tiene la opción de incluir un registro de prueba de rotación en su bloque de firma para cada certificado de firma. Esta capacidad permite que tu app pueda firmarse con un certificado de firma nuevo mediante la vinculación de los certificados anteriores del archivo APK con el certificado con el cual está firmado actualmente.
Nota: Los dispositivos con Android 8.1 (nivel de API 27) o versiones anteriores no admiten el
cambio del certificado de firma. Si la minSdkVersion
de tu app es 27
o
anterior, usa un certificado de firma anterior para firmar tu app, además de la firma
nueva.
Obtén más información sobre cómo rotar claves usando
apksigner
.
Opción para permitir la desencriptación de claves solo en dispositivos desbloqueados
Android 9 presenta el indicador unlockedDeviceRequired
. Esta opción determina
si el Keystore requiere el desbloqueo de la pantalla antes de permitir la
desencriptación de cualquier dato en desarrollo o almacenado usando la clave especificada. Estos tipos
de clave son aptas para encriptar datos confidenciales que se almacenarán en el disco, como información de
salud o empresarial. El indicador proporciona a los usuarios una mayor seguridad de que
los datos no podrán desencriptarse mientras el dispositivo esté bloqueado en caso de que lo pierdan o se los
hayan robado.
Nota: Cuando el indicador unlockedDeviceRequired
está habilitado, la encriptación y
la verificación de firma aún pueden tener lugar en cualquier momento. El indicador evita únicamente
la desencriptación de datos cuando el dispositivo está desbloqueado.
Para mantener una clave segura de la desencriptación mientras el dispositivo está bloqueado, habilita el indicador
pasando true
al método setUnlockedDeviceRequired()
. Después de completar este paso, cuando la pantalla del usuario esté bloqueada, cualquier
intento de desencriptar o firmar datos usando esta clave fallará. Un dispositivo bloqueado requiere un
PIN, una contraseña, una huella dactilar u otro factor de seguridad para poder
acceder a él.
Compatibilidad con encriptación heredada
Los dispositivos con Android 9 que incorporan Keymaster 4 admiten el algoritmo de triple estándar de encriptación de datos, o Triple DES. Si tu app funciona de manera integrada con sistemas heredados que requieren Triple DES, usa este tipo de encriptación para encriptar credenciales confidenciales.
Para obtener más información sobre cómo hacer que tu app sea más segura, consulta Seguridad para desarrolladores de Android.
Copias de seguridad de Android
Android 9 agrega nueva funcionalidad y opciones para desarrolladores en relación con la copia de seguridad y la restauración. En las siguientes secciones se detallan esos cambios.
Copias de seguridad de encriptación del cliente
En Android 9, se agrega asistencia para encriptar copias de seguridad de Android con un secreto del cliente. Esta asistencia se habilita automáticamente cuando se cumplen las siguientes condiciones:
- El usuario habilitó la copia de seguridad usando Android 9 o una versión posterior.
- El usuario configuró un bloqueo de pantalla para su dispositivo que requiere un PIN, un patrón o una contraseña para desbloquearse.
Cuando se habilita esta medida de privacidad, se necesita el PIN, el patrón o la contraseña del dispositivo para restaurar los datos de las copias de seguridad que realiza el dispositivo del usuario. Para obtener más información sobre la tecnología que hizo posible esta característica, consulta el documento Servicio Cloud Key Vault de Google.
Definir las condiciones del dispositivo necesarias para la copia de seguridad
Si los datos de tu app incluyen información confidencial o preferencias, Android 9 te da la posibilidad de definir las condiciones del dispositivo bajo las que se incluyen los datos de tu app en la copia de seguridad del usuario, como cuando se habilita la encriptación del cliente o se produce una transferencia local de un dispositivo a otro.
Para obtener más información sobre la copia de seguridad en dispositivos Android, consulta Descripción general sobre la copia de seguridad de datos.
Accesibilidad
Android 9 introduce en el marco de trabajo de accesibilidad mejoras que facilitan la oferta de experiencias mucho mejores a los usuarios de tu app.
Semántica de navegación
Los atributos agregados a Android 9 facilitan la definición de la manera en que los servicios de accesibilidad, especialmente los lectores de pantalla, navegan de una parte de esta a otra. Estos atributos pueden ayudar a los usuarios con problemas visuales a desplazarse rápidamente por el texto en la IU de tu app y les permiten realizar una selección.
Por ejemplo, en una app de compras, un lector de pantalla puede ayudar a los usuarios a navegar directamente de una categoría de ofertas a la siguiente, sin que el lector de pantalla deba leer todos los elementos de una categoría antes de pasar a la siguiente.
Títulos de subpaneles de accesibilidad
En Android 8.1 (nivel de API 27) y versiones anteriores, los servicios de accesibilidad no siempre pueden determinar cuándo se actualizó un subpanel específico de la pantalla, como cuando una actividad reemplaza un fragmento por otro. Los subpaneles consisten en elementos de la IU relacionados visualmente y agrupados lógicamente que en general incluyen un fragmento.
En Android 9, puedes proporcionar títulos de subpaneles de accesibilidad o títulos que puedan identificarse individualmente para estos subpaneles. Si un subpanel tiene un título para el subpanel de accesibilidad, los servicios de accesibilidad reciben información más detallada cuando el subpanel cambia. Esta capacidad permite que los servicios proporcionen información más detallada al usuario sobre lo que cambia en la IU.
Para especificar el título de un subpanel, usa el atributo
android:accessibilityPaneTitle
. También puedes actualizar el título de un subpanel de la IU que se reemplace en el
tiempo de ejecución usando setAccessibilityPaneTitle()
.
Por ejemplo, puedes proporcionar un título para el área de contenido de un objeto
Fragment
.
Navegación basada en encabezados
Si tu app muestra contenido textual que incluye encabezados lógicos, fija el atributo
android:accessibilityHeading
en true
para las instancias de
View
que representen esos encabezados. Al
agregar estos encabezados, permites que los servicios de accesibilidad ayuden a los usuarios a navegar
directamente de un encabezado al siguiente. Cualquier servicio de accesibilidad puede usar esta
capacidad para mejorar la experiencia de navegación del usuario en la IU.
Salida y navegación grupal
Los lectores de pantalla tradicionalmente han usado el atributo
android:focusable
para
determinar el momento en el que debían leer un
ViewGroup
o un conjunto de objetos
View
como una sola unidad. De esa manera,
los usuarios podían comprender que las vistas se relacionaban lógicamente entre sí.
En Android 8.1 y versiones anteriores, debes marcar cada objeto View
dentro de un
ViewGroup
como no enfocable y el ViewGroup
como enfocable. Esta
disposición hizo que algunas instancias de View
se marcaran como enfocables de una manera que
hacía más engorrosa la navegación con teclado.
A partir de Android 9, puedes usar el atributo
android:screenReaderFocusable
en lugar del atributo android:focusable
en situaciones en las que
hacer enfocable un objeto View
tenga consecuencias no deseadas. Los lectores de pantalla
se enfocan en todos los elementos que fijen android:screenReaderFocusable
o android:focusable
en true
.
Acciones de conveniencia
Android 9 incorpora asistencia para las acciones de conveniencia en representación de los usuarios:
- Interacción con información sobre herramientas
- Las características agregadas al marco de trabajo de accesibilidad te brindan acceso a
información sobre herramientas en la IU de una app. Usa
getTooltipText()
para leer el texto de información sobre herramientas, yACTION_SHOW_TOOLTIP
yACTION_HIDE_TOOLTIP
para indicarles a las instancias deView
que muestren u oculten su información sobre herramientas. - Acciones globales agregadas
- En Android 9 se introduce asistencia para dos acciones de dispositivo adicionales en la clase
AccessibilityService
. Tu servicio puede ayudar a los usuarios a bloquear sus dispositivos y tomar capturas de pantalla usando las accionesGLOBAL_ACTION_LOCK_SCREEN
yGLOBAL_ACTION_TAKE_SCREENSHOT
respectivamente.
Detalles sobre modificaciones de ventanas
Android 9 facilita el seguimiento de actualizaciones en las ventanas de una app cuando esta
vuelve a dibujar varias ventanas de manera simultánea. Cuando tenga lugar un evento
TYPE_WINDOWS_CHANGED
,
usa la API
getWindowChanges()
para determinar cómo se han modificado las ventanas. Durante la actualización de varias ventanas, cada
una de estas produce su propio conjunto de eventos.
El método getSource()
muestra la vista raíz de la ventana asociada con cada evento.
Si una app define títulos de subpaneles de accesibilidad para sus objetos
View
, tu servicio puede reconocer
los casos en los que se actualice la IU de la app. Cuando se produzca un evento
TYPE_WINDOW_STATE_CHANGED
,
usa los tipos que muestre
getContentChangeTypes()
para determinar el modo en que se modificó la ventana. Por ejemplo, el marco de trabajo ahora puede
detectar los casos en que un subpanel tiene un título nuevo o desaparece.
Rotación
Para eliminar las rotaciones involuntarias, hemos agregado un modo nuevo que fija la orientación actual aun cuando se modifica la posición del dispositivo. Cuando sea necesario, los usuarios pueden activar la rotación de manera manual presionando un botón en la barra del sistema.
En la mayoría de los casos, el impacto de compatibilidad para las apps es mínimo. Sin embargo, si tu app tiene algún comportamiento de rotación personalizado o usa una configuración de orientación de pantalla poco común, podrías experimentar problemas que anteriormente puedan haber pasado inadvertidos al estar siempre fija en el modo de retrato la preferencia de rotación del usuario. Te sugerimos observar el comportamiento de rotación en todas las actividades principales de tu app y asegurarte de que todas las configuraciones de orientación de pantalla aún proporcionen la experiencia óptima.
Para obtener información detallada, consulta los cambios de comportamiento asociados.

Un modo nuevo de rotación permite a los usuarios activar la rotación de modo manual, cuando sea necesaria, mediante un botón de la barra del sistema.
Texto
Android 9 aporta las siguientes características relacionadas con texto a la plataforma:
Texto previamente calculado: la clase
PrecomputedText
mejora el rendimiento de la representación de texto permitiéndote calcular y almacenar en caché la información necesaria con antelación. También permite que tu app diseñe el texto a partir del subproceso principal.Lupa: la clase
Magnifier
es un widget de la plataforma que proporciona una API de lupa, lo cual proporciona una experiencia uniforme de la característica lupa en todas las apps.Vinculación inteligente: Android 9 mejora la clase
TextClassifier
, que aprovecha el aprendizaje automático para identificar algunas entidades en el texto seleccionado y sugerir acciones. Por ejemplo,TextClassifier
puede permitir que tu app determine si el usuario ha seleccionado un número de teléfono. Luego, tu app puede sugerir que el usuario realice una llamada telefónica usando ese número. Las características deTextClassifier
reemplazan la funcionalidad de la claseLinkify
.Disposición del texto: hay varios métodos y atributos convenientes que facilitan la implementación del diseño de tu IU. Si deseas obtener información detallada, consulta la documentación de referencia para
TextView
.
Conversión de archivos DEX predefinida de ART
En dispositivos con Android 9 o versiones posteriores, el compilador predefinido del tiempo de ejecución de Android (ART) optimiza aún más los archivos comprimidos en formato Dalvik Executable (DEX) convirtiendo los archivos DEX de un paquete de apps en una representación más compacta. Este cambio permite que tu app se inicie más rápido y ocupe menos espacio en disco y memoria RAM.
Esta mejora beneficia particularmente a dispositivos de gama baja con velocidades de entrada y salida de disco menores.
Seguimiento del sistema en el dispositivo
Android 9 te permite registrar seguimientos del sistema desde tu dispositivo y luego compartir un informe de esas grabaciones con tu equipo de desarrollo. Este informe admite varios formatos, incluido el HTML.
Al recopilar esos seguimientos, puedes capturar datos de sincronización relacionados con los procesos y subprocesos de tu app, y ver otros tipos de estados de dispositivos importantes a nivel global.
Nota: No necesitas instrumentar tu código para registrar seguimientos, pero hacerlo puede ayudarte a ver las partes del código de tu app que podrían contribuir a bloquear los subprocesos o la IU.
Para obtener más información sobre esta herramienta, consulta Realizar un seguimiento del sistema en el dispositivo.