Android 9 (nivel de API 28) incluye excelentes funciones y capacidades nuevas para usuarios y desarrolladores. En este documento, se destacan las novedades para desarrolladores.
Para obtener más información sobre las nuevas APIs, lee el informe de diferencias de las APIs o consulta la referencia de la API de Android. Además, asegúrate de consultar los cambios en el comportamiento de Android 9 para obtener información sobre las áreas en las que los cambios en la plataforma podrían afectar tus apps.
Posicionamiento en interiores con RTT de Wi-Fi

Android 9 agrega compatibilidad con la plataforma para el protocolo Wi-Fi IEEE 802.11-2016, también conocido como Wi-Fi Round-Trip-Time (RTT), para que puedas aprovechar el posicionamiento en interiores en tus apps.
En los dispositivos que ejecutan Android 9 con compatibilidad de hardware, tus apps pueden usar las APIs de RTT para medir la distancia a los puntos de acceso (PA) Wi-Fi cercanos con capacidad de RTT. El dispositivo debe tener habilitados los servicios de ubicación y la búsqueda de Wi-Fi (en Configuración > Ubicación), y tu app debe tener el permiso ACCESS_FINE_LOCATION
. El dispositivo no necesita conectarse a los puntos de acceso para usar RTT.
Para mantener la privacidad, solo el teléfono puede determinar la distancia al 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 mediciones. La precisión del resultado generalmente va de 1 a 2 metros.
Con esta precisión, puedes crear nuevas experiencias, como la navegación en interiores y servicios basados en la ubicación detallados, como el control por voz sin ambigüedades (por ejemplo, "Enciende esta luz") y la información basada en la ubicación (como "¿Hay ofertas especiales para este producto?").
Consulta la API de Wi-Fi RTT en uso en la app de demostración de Android WifiRttScan.
Para obtener más información, consulta Ubicación Wi-Fi: rangos con RTT.
Compatibilidad con cortes de pantalla

Cómo probar el corte de pantalla con el emulador
Android 9 ofrece compatibilidad con las pantallas de borde a borde más recientes que contienen cortes de pantalla para cámaras y bocinas. La clase DisplayCutout
te permite conocer la ubicación y la forma de las áreas no funcionales en las que no se debe mostrar contenido. Para determinar la existencia y la ubicación de estas áreas de corte, usa el método getDisplayCutout()
.
Un nuevo atributo de diseño de ventana, layoutInDisplayCutoutMode
, permite que tu app diseñe su contenido alrededor de los cortes de un dispositivo. Puedes establecer 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 corte de pantalla en cualquier dispositivo o emulador que ejecute Android 9 de la siguiente manera:
- Habilita las opciones para desarrolladores.
- En la pantalla Opciones para desarrolladores, desplázate hacia abajo hasta la sección Dibujo y selecciona Simular una pantalla con un corte.
- Selecciona el tamaño del corte.
Notificaciones
Android 9 incluye varias mejoras en las notificaciones, todas disponibles para los desarrolladores que segmentan sus apps para el nivel de API 28 y versiones posteriores.

MessagingStyle con foto adjunta.

MessagingStyle con respuestas y conversación.
Para obtener un ejemplo de código que usa notificaciones, incluidas las funciones de Android 9, consulta el Ejemplo de personas.
Experiencia de mensajería mejorada
A partir de Android 7.0 (nivel de API 24), puedes agregar una acción para responder a los mensajes o ingresar otro texto directamente desde una notificación. Android 9 mejora esta función con las siguientes mejoras:
Compatibilidad simplificada con los participantes de la conversación: La clase
Person
se usa para identificar a las personas involucradas en una conversación, incluidos sus avatares y URIs. Muchas otras APIs, comoaddMessage()
, ahora aprovechan la clasePerson
en lugar de unCharSequence
. 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 de mensajería en teléfonos. Puedes usar
setData()
en el mensaje para mostrar una imagen. En el siguiente fragmento de código, se muestra cómo crear un objetoPerson
y un mensaje que contiene 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);
Guardar respuestas como borradores: Tu app puede recuperar el objeto
EXTRA_REMOTE_INPUT_DRAFT
que envía el sistema cuando un usuario cierra accidentalmente una notificación de mensajería. Puedes usar este elemento adicional para completar previamente los campos de texto en la app, de modo que los usuarios puedan terminar su respuesta.Identifica si una conversación es grupal: Puedes usar
setGroupConversation()
para identificar intencionalmente una conversación como grupal o no grupal.Establece la acción semántica para un intent: El método
setSemanticAction()
te permite dar un significado semántico a una acción, como "marcar como leído", "borrar", "responder", etcétera.Respuesta inteligente: Android 9 admite las mismas respuestas sugeridas disponibles en tu app de mensajería. Usa
RemoteInput.setChoices()
para proporcionar un array de respuestas estándar al usuario.
Configuración del canal, transmisiones y No interrumpir
Android 8.0 introdujo los canales de notificación, que te permiten crear un canal personalizable por el usuario para cada tipo de notificación que quieras mostrar. Android 9 simplifica las configuraciones del canal de notificaciones con estos cambios:
Bloqueo de grupos de canales: Ahora los usuarios pueden bloquear grupos completos de canales en la configuración de notificaciones de una app. Puedes usar el método
isBlocked()
para identificar cuándo se bloquea un grupo y, como resultado, no enviar notificaciones de los canales de ese grupo.Además, tu app puede consultar la configuración actual del grupo de canales con el nuevo método
getNotificationChannelGroup()
.Nuevos tipos de intents de transmisión: El sistema Android ahora envía intents de transmisión cuando cambia el estado de bloqueo de los canales de notificaciones y los grupos de canales. La app propietaria del canal o grupo bloqueado puede detectar estos intents y reaccionar según corresponda. Para obtener más información sobre estas acciones y elementos adicionales de intents, consulta la lista de constantes actualizada en la referencia de
NotificationManager
. Para obtener información sobre cómo reaccionar a intents de transmisión, consulta Transmisiones.NotificationManager.Policy
tiene tres nuevas categorías de prioridad de No molestar:PRIORITY_CATEGORY_ALARMS
prioriza las alarmas.PRIORITY_CATEGORY_MEDIA
prioriza los sonidos de fuentes multimedia, como la navegación multimedia y por voz.PRIORITY_CATEGORY_SYSTEM
prioriza los sonidos del sistema.
NotificationManager.Policy
también tiene siete nuevas constantes de No interrumpir que puedes usar para suprimir las interrupciones visuales:SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
evita que la notificación inicie la actividad en pantalla completa.SUPPRESSED_EFFECT_LIGHTS
bloquea las luces de notificación.SUPPRESSED_EFFECT_PEEK
evita que las notificaciones se deslicen brevemente para mostrarse ("peek").SUPPRESSED_EFFECT_STATUS_BAR
evita que las notificaciones aparezcan en la barra de estado de los dispositivos que la admiten.SUPPRESSED_EFFECT_BADGE
bloquea las insignias en los dispositivos que admiten insignias. Para obtener más información, consulta Cómo modificar una insignia de notificación.SUPPRESSED_EFFECT_AMBIENT
bloquea las notificaciones en dispositivos que admiten pantallas 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 la cámara
En los dispositivos que ejecutan Android 9, puedes acceder a transmisiones simultáneamente desde dos o más cámaras físicas. En los dispositivos con doble cámara frontal o trasera, puedes crear funciones innovadoras que no son posibles con una sola cámara, como zoom sin interrupciones, bokeh y visión estéreo. La API también te permite llamar a una transmisión de cámara lógica o fusionada que cambia automáticamente entre dos o más cámaras.
Otras mejoras en la cámara incluyen parámetros de sesión adicionales que ayudan a reducir los retrasos durante la captura inicial y el uso compartido de superficies que permite que los clientes de la cámara controlen varios casos de uso sin necesidad de detener y reiniciar la transmisión de la cámara. También agregamos APIs para la compatibilidad con flash basado en la pantalla y el acceso a las marcas de tiempo del OIS para la estabilización de imágenes y los efectos especiales a nivel de la app.
En Android 9, la API de varias cámaras admite cámaras monocromáticas para dispositivos con capacidad de FULL
o LIMITED
.
El resultado monocromático se logra a través del 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 compatibilidad con cámaras externas USB/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 decodificar imágenes. Usa esta clase en lugar de las APIs de BitmapFactory
y BitmapFactory.Options
.
ImageDecoder
te permite crear un objeto Drawable
o 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 ancho y la altura predeterminados de la imagen, una vez que se conocen.
Si la imagen codificada es un GIF o WebP animados, decodeDrawable()
devuelve un Drawable
que es una instancia de la clase AnimatedImageDrawable
.
Existen métodos diferentes que puedes usar para fijar las propiedades de imagen:
- Para ajustar la 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 la muestra directamente asetTargetSampleSize()
. - Para recortar una imagen dentro del rango de la imagen escalada, 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 dibujo que desees.
Animación
Android 9 introduce la clase AnimatedImageDrawable
para dibujar y mostrar imágenes animadas en formato GIF y WebP.
AnimatedImageDrawable
funciona de manera similar a AnimatedVectorDrawable
, ya que el subproceso de renderización controla las animaciones de AnimatedImageDrawable
.
El subproceso de renderización también usa un subproceso de trabajador para decodificar, de modo que la decodificación no interfiera con otras operaciones en el subproceso de renderizació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 IU de tu app.
Un AnimatedImageDrawable
se puede decodificar con una instancia de ImageDecoder
. En el siguiente fragmento de código, se muestra cómo 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 modificar aún más la imagen.
Por ejemplo, puedes usar el método setPostProcessor()
para modificar la apariencia de la imagen, como aplicar una máscara de círculo o esquinas redondeadas.
Video HDR VP9, compresión de imágenes HEIF y APIs de Media
Android 9 proporciona compatibilidad integrada con el perfil 2 de VP9 de alto rango dinámico (HDR), por lo que puedes ofrecer películas compatibles con HDR a tus usuarios desde YouTube, Play Películas y otras fuentes en dispositivos compatibles con HDR.
Android 9 también agrega compatibilidad para codificar imágenes con el formato de archivo de imagen de alta eficiencia (HEIF o HEIC), que mejora la compresión y reduce el uso del espacio de almacenamiento y los datos de red. Se admiten muestras de imágenes fijas HEIF en las clases MediaMuxer
y MediaExtractor
. Con la compatibilidad de la plataforma en dispositivos Android 9, es fácil enviar y utilizar imágenes HEIF desde tu servidor de backend. Después de asegurarte de que tu app sea compatible con este formato de datos para compartir y mostrar, prueba HEIF como formato de almacenamiento de imágenes en tu app. Puedes realizar una conversión de JPEG a HEIC con ImageDecoder
o BitmapFactory
(que obtiene un mapa de bits de un archivo JPEG). Luego, puedes usar HeifWriter
para escribir imágenes fijas HEIF a partir de búferes de bytes YUV o instancias de Surface
o Bitmap
.
Las métricas de medios también están disponibles en las clases AudioTrack
, AudioRecord
y MediaDrm
.
Android 9 introduce métodos en la clase MediaDRM
para obtener métricas, niveles de HDCP, niveles de seguridad y cantidad de sesiones, y para agregar más control sobre los niveles de seguridad y las detenciones seguras. Consulta el informe de diferencias de la API para obtener más detalles.
En Android 9, la API de AAudio agrega compatibilidad con varios atributos de AAudioStream adicionales, incluidos el uso, el tipo de contenido y el ajuste predeterminado de entrada. Con estos atributos, puedes crear transmisiones optimizadas para aplicaciones de VoIP o de videocámara. También puedes configurar el ID de sesión para asociar una transmisión de AAudio con una mezcla secundaria que puede incluir efectos. Usa la API de AudioEffect
para controlar los efectos.
Android 9 introduce la API de AudioEffect
para el procesamiento de dinámica.
Con esta clase, puedes crear efectos de audio basados en canales, como ecualización, compresión multibanda y limitador, en varias etapas. La cantidad de bandas y escenarios activos se puede configurar, y la mayoría de los parámetros se pueden controlar en tiempo real.
JobScheduler para datos de costo confidenciales
A partir de Android 9, JobScheduler
puede usar los indicadores de estado de la red que proporcionan los operadores para mejorar el manejo de los trabajos relacionados con la red.
Los trabajos pueden declarar el tamaño de datos estimado, indicar la recuperación previa y especificar requisitos de red detallados. Luego, JobScheduler
administra el trabajo según el estado de la red. Por ejemplo, cuando la red indica que está congestionada, JobScheduler
podría aplazar las solicitudes de red grandes. Cuando se encuentra en una red sin medición, JobScheduler
puede ejecutar trabajos de recuperación previa para mejorar la experiencia del usuario, por ejemplo, recuperando previamente los titulares.
Cuando agregues trabajos, asegúrate de usar setEstimatedNetworkBytes()
, setPrefetch()
y setRequiredNetwork()
cuando sea apropiado para ayudar a JobScheduler
a manejar el trabajo correctamente. Cuando se ejecute tu trabajo, asegúrate de usar el objeto Network
que devuelve JobParameters.getNetwork()
.
De lo contrario, usarás de forma implícita la red predeterminada del dispositivo, que tal vez no cumpla con tus requisitos y genere un uso de datos no deseado.
API de Neural Networks 1.1
La API de Neural Networks se introdujo en Android 8.1 (nivel de API 27) para acelerar el aprendizaje automático en el dispositivo en Android. Android 9 expande y mejora la API, y agrega compatibilidad con nueve operaciones nuevas:
- Operaciones matemáticas en términos de elementos:
- Operaciones de matrices:
Problema conocido: Cuando se pasan los tensores ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
a la operación ANEURALNETWORKS_PAD
, que está disponible en Android 9 y versiones posteriores, es posible que la salida de la NNAPI no coincida con la salida de los frameworks 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 presenta una nueva función, ANeuralNetworksModel_relaxComputationFloat32toFloat16()
, que te permite especificar si se debe calcular ANEURALNETWORKS_TENSOR_FLOAT32
con un rango y una precisión tan bajos como los del formato de punto flotante IEEE 754 de 16 bits.
Autofill Framework
Android 9 presenta varias mejoras que los servicios de autocompletado pueden implementar para mejorar aún más la experiencia del usuario cuando completa formularios. Si quieres obtener más información para usar las funciones de autocompletado en tu app, consulta la guía de Autofill Framework.
Mejoras de seguridad
En Android 9, se incluyen varias funciones de seguridad que se resumen en las siguientes secciones:
Confirmación de protección de Android
Los dispositivos compatibles que ejecutan 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 sensible, como un pago.
Si el usuario acepta la declaración, Android Keystore recibe y almacena una firma criptográfica protegida por un código de autenticación de mensajes basado en hash con clave (HMAC). Después de que Android Keystore confirme la validez del mensaje, tu app podrá usar la clave generada a partir de trustedConfirmationRequired
en el entorno de ejecución de confianza (TEE) para firmar el mensaje que aceptó el usuario. La firma indica, con un alto grado de confianza, que el usuario vio la declaración y la aceptó.
Precaución: La Confirmación de protección de Android no proporciona un canal de información seguro para el usuario. Tu app no puede asumir garantías de confidencialidad más allá de las que ofrece la plataforma de Android. En especial, no uses este flujo de trabajo para mostrar información sensible que no mostrarías normalmente en el dispositivo del usuario.
Si deseas obtener orientación para agregar compatibilidad con la Confirmación protegida de Android, consulta la guía de Confirmación protegida de Android.
Diálogo unificado de autenticación biométrica
En Android 9, el sistema proporciona diálogos de autenticación biométrica en nombre de tu app. Esta funcionalidad crea una apariencia, una sensación y una ubicación estandarizadas para el diálogo, lo que les brinda a los usuarios más confianza en que se están autenticando con un verificador de credenciales biométricas de confianza.
Si tu app usa FingerprintManager
para mostrar un diálogo de autenticación con huella dactilar a los usuarios, comienza a usar BiometricPrompt
en su lugar. BiometricPrompt
depende del sistema para mostrar el diálogo de autenticación. También cambia su comportamiento para adaptarse al tipo de autenticación biométrica que eligió el usuario.
Módulo de seguridad de hardware
Los dispositivos compatibles que ejecutan Android 9 o versiones posteriores pueden tener un StrongBox KeyMint (anteriormente Keymaster), una implementación de la HAL de KeyMint (anteriormente Keymaster) 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 y sideloading no autorizado de apps
Cuando se verifican las claves almacenadas en el StrongBox KeyMint, 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 KeyMint, consulta Módulo de seguridad de hardware.
Importación de claves segura en el almacén de claves
Android 9 proporciona seguridad adicional en la desencriptación de claves, ya que agrega la capacidad de importar claves encriptadas de forma segura al almacén de claves a través de un formato de clave con codificación ASN.1. Luego, KeyMint desencripta las claves en el almacén de claves, por lo que el contenido de las claves nunca aparece como texto sin formato en la memoria host del dispositivo.
Obtén más información para importar claves encriptadas de manera 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 se firme con un nuevo certificado de firma vinculando los certificados de firma anteriores del archivo APK al certificado con el que ahora se firma.
Obtén más información para rotar claves con apksigner
.
Opción para permitir la desencriptación de la clave solo en dispositivos desbloqueados
Android 9 presenta la marca unlockedDeviceRequired
. Esta opción determina si Keystore requiere que se desbloquee la pantalla antes de permitir la desencriptación de los datos en tránsito o almacenados con la clave especificada. Estos tipos de claves son adecuados para encriptar datos sensibles que se almacenan en el disco, como datos de salud o empresariales. La marca proporciona a los usuarios una mayor garantía de que los datos no se pueden desencriptar mientras el dispositivo está bloqueado en caso de que se pierda o se robe el teléfono.
Para proteger una clave de la desencriptación mientras el dispositivo está bloqueado, habilita la marca pasando true
al método setUnlockedDeviceRequired()
. Después de completar este paso, cuando la pantalla del usuario esté bloqueada, fallarán todos los intentos de desencriptar o firmar datos con esta clave. Para acceder a un dispositivo bloqueado, se requiere un PIN, una contraseña, una huella dactilar o algún otro factor de confianza.
Compatibilidad con la encriptación heredada
Los dispositivos con Android 9 que incluyen Keymaster 4 admiten el algoritmo de encriptación de datos triple, o Triple DES. Si tu app interactúa con sistemas heredados que requieren Triple DES, usa este tipo de cifrado cuando encriptes credenciales sensibles.
Para obtener más información acerca de cómo hacer que tu app sea más segura, consulta Seguridad para desarrolladores de Android.
Baja de WPS
Wi-Fi Protected Setup (WPS) dejó de estar disponible por motivos de seguridad.
Copias de seguridad de Android
Android 9 agrega nuevas funciones y opciones para desarrolladores relacionadas con la copia de seguridad y el restablecimiento. En las siguientes secciones, se brindan detalles sobre estos cambios.
Copias de seguridad de la encriptación del cliente
Android 9 agrega compatibilidad para encriptar copias de seguridad de Android con un secreto del cliente. Esta compatibilidad se habilita automáticamente cuando se cumplen las siguientes condiciones:
- El usuario habilitó la copia de seguridad con 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 desbloquearlo.
Cuando se habilita esta medida de privacidad, se requiere el PIN, el patrón o la contraseña del dispositivo para restablecer los datos de las copias de seguridad que se hicieron en el dispositivo del usuario. Para obtener más información sobre la tecnología detrás de esta función, consulta el informe técnico de Google Cloud Key Vault Service.
Cómo definir las condiciones del dispositivo necesarias para la copia de seguridad
Si los datos de tu app incluyen información o preferencias sensibles, Android 9 te permite definir las condiciones del dispositivo en las que se incluyen los datos de tu app en la copia de seguridad del usuario, por ejemplo, cuando se habilita la encriptación del cliente o se realiza una transferencia local de dispositivo a dispositivo.
Para obtener más información sobre cómo crear copias de seguridad de los datos en dispositivos Android, consulta Descripción general de la copia de seguridad de datos.
Accesibilidad
Android 9 introduce mejoras en el framework de accesibilidad que facilitan la tarea de brindar experiencias aún mejores a los usuarios de tu app.
Semántica de navegación
Los atributos agregados en Android 9 te facilitan la definición de cómo los servicios de accesibilidad, en especial los lectores de pantalla, navegan de una parte de la pantalla a otra. Estos atributos pueden ayudar a los usuarios con discapacidad visual a desplazarse rápidamente por el texto en la IU de tu app y permitirles 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 tenga que leer todos los elementos de una categoría antes de pasar a la siguiente.
Títulos del panel 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 panel específico de la pantalla, por ejemplo, cuando una actividad reemplaza un fragmento por otro. Los paneles constan de elementos de la IU agrupados de forma lógica y relacionados visualmente que suelen componer un fragmento.
En Android 9, puedes proporcionar títulos de paneles de accesibilidad o títulos identificables de forma individual para estos paneles. Si un panel tiene un título de panel de accesibilidad, los servicios de accesibilidad reciben información más detallada cuando cambia el panel. Esta capacidad permite que los servicios proporcionen información más detallada al usuario sobre los cambios en la IU.
Para especificar el título de un panel, usa el atributo android:accessibilityPaneTitle
. También puedes actualizar el título de un panel de la IU que se reemplaza en el tiempo de ejecución con setAccessibilityPaneTitle()
.
Por ejemplo, podrías 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, establece el atributo android:accessibilityHeading
en true
para las instancias de View
que representan esos encabezados. Si agregas 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 por la IU de los usuarios.
Navegación y salida de grupo
Tradicionalmente, los lectores de pantalla han usado el atributo android:focusable
para determinar cuándo deben leer un ViewGroup
o una colección de objetos View
como una sola unidad. De esa manera, los usuarios podrían comprender que las vistas estaban relacionadas 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
en sí como enfocable. Esta disposición provocó que algunas instancias de View
se marcaran como enfocables de una manera que dificultaba la navegación con el teclado.
A partir de Android 9, puedes usar el atributo android:screenReaderFocusable
en lugar del atributo android:focusable
en situaciones en las que hacer que un objeto View
sea enfocable tiene consecuencias no deseadas. Los lectores de pantalla enfocan todos los elementos que tienen configurado android:screenReaderFocusable
o android:focusable
como true
.
Acciones de conveniencia
Android 9 incorpora asistencia para las acciones de conveniencia en representación de los usuarios:
- Interacción con las Tooltips
- Las funciones agregadas en el framework de accesibilidad te brindan acceso a la información sobre la herramienta en la IU de una app. Usa
getTooltipText()
para leer el texto de la información sobre la herramienta y utilizaACTION_SHOW_TOOLTIP
yACTION_HIDE_TOOLTIP
para indicar instancias deView
a fin de mostrar o de ocultar la información sobre la herramienta. - Se agregaron acciones generales
- Android 9 introduce compatibilidad con 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 con las accionesGLOBAL_ACTION_LOCK_SCREEN
yGLOBAL_ACTION_TAKE_SCREENSHOT
, respectivamente.
Detalles del cambio de ventana
Android 9 facilita el seguimiento de las actualizaciones de las ventanas de una app cuando esta vuelve a dibujar varias ventanas de forma simultánea. Cuando se produce un evento de TYPE_WINDOWS_CHANGED
, usa la API de getWindowChanges()
para determinar cómo cambiaron las ventanas. Durante una actualización de varias ventanas, cada ventana genera su propio conjunto de eventos.
El método getSource()
devuelve la vista raíz de la ventana asociada con cada evento.
Si una app definió títulos del panel de accesibilidad para sus objetos View
, tu servicio puede reconocer cuándo se actualiza la IU de la app. Cuando se produce un evento de TYPE_WINDOW_STATE_CHANGED
, usa los tipos que devuelve getContentChangeTypes()
para determinar cómo cambió la ventana. Por ejemplo, el framework puede detectar en qué momento un panel tiene un título nuevo o en qué momento un panel desapareció.
Rotación
Para eliminar las rotaciones involuntarias, agregamos un modo que fija la orientación actual incluso si cambia la posición del dispositivo. Los usuarios pueden activar la rotación manualmente cuando sea necesario 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 parámetros de configuración de orientación de pantalla inusuales, es posible que surjan problemas que habrían pasado desapercibidos antes, cuando la preferencia de rotación del usuario siempre se establecía en vertical. Te recomendamos que observes el comportamiento de rotación en todas las actividades clave de tu app y te asegures de que todos los parámetros de configuración de orientación de la pantalla sigan brindando la experiencia óptima.
Para obtener más detalles, 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 incorpora las siguientes funciones relacionadas con el texto a la plataforma:
Texto precalculado: La clase
PrecomputedText
mejora el rendimiento de la renderización de texto, ya que te permite calcular y almacenar en caché la información requerida con anticipación. También permite que tu app realice el diseño de texto fuera del subproceso principal.Lupa: La clase
Magnifier
es un widget de plataforma que proporciona una API de lupa, lo que permite una experiencia coherente con la función de lupa en todas las apps.Smart Linkify: 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 detecte que el usuario seleccionó un número de teléfono. Luego, tu app podría sugerirle al usuario que haga una llamada telefónica con ese número. Las funciones enTextClassifier
reemplazan la funcionalidad de la claseLinkify
.Diseño de texto: Varios métodos y atributos convenientes facilitan la implementación del diseño de la IU. Para obtener más detalles, consulta la documentación de referencia de
TextView
.
Conversión anticipada de archivos DEX por parte de ART
En los dispositivos que ejecutan Android 9 o versiones posteriores, el compilador anticipado (AOT) de Android Runtime (ART) optimiza aún más los archivos comprimidos de formato ejecutable de Dalvik (DEX) convirtiendo los archivos DEX de un paquete de app en una representación más compacta. Este cambio permite que tu app se inicie más rápido y consuma menos espacio en el disco y RAM.
Esta mejora beneficia especialmente a los dispositivos de gama baja con velocidades de E/S de disco más lentas.
Registro del sistema en el dispositivo
Android 9 te permite grabar registros del sistema desde tu dispositivo y, luego, compartir un informe de estas grabaciones con tu equipo de desarrollo. Este informe admite varios formatos, incluido HTML.
Si recopilas estos registros, puedes capturar datos de sincronización relacionados con los procesos y subprocesos de tu app, y ver otros tipos de estados del dispositivo que son significativos a nivel global.
Para obtener más información sobre esta herramienta, consulta Cómo realizar un registro del sistema en el dispositivo.