Características y API de Android 9

Android 9 (nivel de API 28) incluye excelentes funciones y capacidades nuevas para los usuarios y desarrolladores. En este documento, se destacan las novedades para desarrolladores.

Para obtener más información sobre las APIs nuevas, 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 de comportamiento en 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 Wi-Fi RTT

Las nuevas APIs de RTT admiten el posicionamiento en interiores en tus apps.

Android 9 agrega compatibilidad de plataforma con el protocolo de Wi-Fi IEEE 802.11-2016, también conocido como tiempo de ida y vuelta (RTT) de Wi-Fi, para que puedas aprovechar el posicionamiento en interiores en tus apps.

En los dispositivos que ejecutan Android 9 y son compatibles con hardware, tus apps pueden usar las APIs de RTT para medir la distancia a los puntos de acceso (PA) Wi-Fi cercanos compatibles con RTT. El dispositivo debe tener habilitados los servicios de ubicación y la búsqueda de Wi-Fi activada (en Configuración > Ubicación), y la 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 mantener 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 adapte a esas mediciones. La precisión del resultado generalmente va de 1 a 2 metros.

Con esta precisión, puedes crear experiencias nuevas, como navegación en el edificio y servicios específicos basados en la ubicación, como el control por voz inequívoco (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 RTT de Wi-Fi que se usa en la app de demostración de Android WifiRttScan.

Para obtener más información, consulta Ubicación de Wi-Fi: rangos con RTT.

Compatibilidad con el corte de pantalla

Pantalla de opciones para desarrolladores que muestra diferentes tamaños de corte

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 encontrar la ubicación y la forma de las áreas no funcionales en las que no se debe mostrar el contenido. Para determinar la existencia y la posición de estas áreas de corte, usa el método getDisplayCutout().

Un nuevo atributo de diseño de ventana, layoutInDisplayCutoutMode, permite que tu app distribuya su contenido alrededor de los cortes de un dispositivo. Puedes establecer este atributo en uno de los siguientes valores:

Puedes simular un corte de pantalla en cualquier dispositivo o emulador que ejecute Android 9 de la siguiente manera:

  1. Habilita las opciones para desarrolladores.
  2. En la pantalla Opciones para desarrolladores, desplázate hacia abajo hasta la sección Dibujo y selecciona Simular una pantalla con un corte.
  3. Selecciona el tamaño del corte.

Notificaciones

Android 9 presenta varias mejoras en las notificaciones, que están disponibles para los desarrolladores que tienen como objetivo el nivel de API 28 y versiones posteriores.

Notificaciones de mensajes

MessagingStyle con foto adjunta.

Notificación de mensajería

MessagingStyle con respuestas y conversación.

Para ver un código de ejemplo que usa notificaciones, incluidas las funciones de Android 9, consulta la Muestra 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. En Android 9, esta función se mejora con las siguientes mejoras:

  • Compatibilidad simplificada para participantes de conversaciones: La clase Person se usa para identificar a las personas que participan en una conversación, incluidos sus avatares y URI. Muchas otras APIs, como addMessage(), ahora aprovechan la clase Person en lugar de CharSequence. La clase Person 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. Puedes usar setData() en el mensaje para mostrar una imagen. En el siguiente fragmento de código, se muestra cómo crear un Person 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);
  • Guarda respuestas como borradores: Tu app puede recuperar el EXTRA_REMOTE_INPUT_DRAFT que envía el sistema cuando un usuario cierra una notificación de mensajería de manera involuntaria. Puedes usar este elemento adicional para prepropagar 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, de manera deliberada, una conversación como grupal o no grupal.

  • Configura la acción semántica para un intent: el método setSemanticAction() te permite dar significado semántico a una acción, como "marcar como leído", "borrar", "responder", etcétera.

  • SmartResponder: Android 9 admite las mismas respuestas sugeridas que están disponibles en tu app de mensajería. Usa RemoteInput.setChoices() para proporcionar una variedad de respuestas estándar al usuario.

Configuración del canal, transmisiones y No interrumpir

Android 8.0 introdujo los canales de notificaciones, que te permiten crear un canal que el usuario puede personalizar 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 cuando 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 de los grupos 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 a la que pertenece el canal o grupo bloqueado puede escuchar estos intents y reaccionar según corresponda. Para obtener más información sobre las acciones de intents y los extras, consulta la lista de constantes actualizadas en la referencia de NotificationManager. Para obtener información sobre cómo reaccionar a los intents de transmisión, consulta Transmisiones.

  • NotificationManager.Policy tiene tres categorías nuevas de prioridad para No interrumpir:

  • NotificationManager.Policy también tiene siete constantes nuevas de No interrumpir que puedes usar para suprimir la interrupción visual:

Compatibilidad con varias cámaras y actualizaciones de cámaras

En los dispositivos que ejecutan Android 9, puedes acceder a transmisiones simultáneas desde dos o más cámaras físicas. En dispositivos con dos cámaras frontales o posteriores, puedes crear funciones innovadoras que no son posibles con una sola cámara, como el zoom fluido, el bokeh y la 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 la superficie que permite a los clientes de la cámara manejar varios casos de uso sin necesidad de detener ni iniciar la transmisión de la cámara. También agregamos APIs para brindar compatibilidad con Flash basada en la pantalla y acceso a marcas de tiempo de OIS para la estabilización de imagen y efectos especiales en el nivel de la app.

En Android 9, la API de varias cámaras admite cámaras monocromáticas para dispositivos compatibles con FULL o LIMITED. La salida monocromática 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 presenta la clase ImageDecoder, que proporciona un enfoque modernizado para la decodificación de imágenes. Usa esta clase en lugar de las APIs de 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 Drawable o 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 los conozcas. Si la imagen codificada es un GIF o WebP animado, decodeDrawable() muestra una Drawable que es una instancia de la clase AnimatedImageDrawable.

Existen métodos diferentes que puedes usar para fijar las propiedades de imagen:

  • Para escalar 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 a setTargetSampleSize().
  • 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 a setMutableRequired().

ImageDecoder también te permite agregar efectos personalizados y complicados 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 GIF y WebP. AnimatedImageDrawable funciona de manera similar a AnimatedVectorDrawable en el sentido de que el subproceso de renderización impulsa las animaciones de AnimatedImageDrawable. El subproceso de renderización también usa un subproceso de trabajo 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 en otros eventos en el subproceso de IU de tu app.

Se puede decodificar un AnimatedImageDrawable mediante 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 realizar más modificaciones a la imagen. Por ejemplo, puedes usar el método setPostProcessor() para modificar el aspecto de la imagen, como aplicar una máscara circular o esquinas redondeadas.

Video HDR VP9, compresión de imagen HEIF y APIs de medios

Android 9 brinda compatibilidad integrada con el alto rango dinámico (HDR) en el perfil 2 de VP9 para que puedas 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 espacio de almacenamiento y el uso de datos de red. Las muestras de imágenes estáticas de HEIF son compatibles con las clases MediaMuxer y MediaExtractor. Con la compatibilidad de la plataforma en dispositivos con Android 9, es fácil enviar y usar imágenes HEIF desde tu servidor de backend. Una vez que te asegures de que tu app sea compatible con este formato de datos para compartir y mostrar contenido, prueba el formato 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 estáticas HEIF desde búferes de bytes YUV o instancias de Surface o Bitmap.

Las métricas de contenido multimedia también están disponibles en las clases AudioTrack, AudioRecord y MediaDrm.

Android 9 presenta métodos a la clase MediaDRM para obtener métricas, niveles de HDCP, niveles de seguridad y cantidad de sesiones, así como agregar un mayor control sobre los niveles de seguridad y proteger las detenciones. Consulta el informe de diferencias de API para obtener más detalles.

En Android 9, la API de AAudio admite varios atributos de AAudioStream adicionales, incluidos el uso, el tipo de contenido y los ajustes predeterminados de entrada. Con estos atributos, puedes crear transmisiones que se ajustan a aplicaciones de VoIP o de videocámara. También puedes establecer el ID de sesión para asociar una transmisión de AAudio con una submezcla que puede incluir efectos. Usa la API de AudioEffect para controlar los efectos.

Android 9 presenta la API de AudioEffect para el procesamiento dinámico. Con esta clase, puedes compilar efectos de audio basados en canales, incluidos la ecualización, la compresión multibanda y el limitador, en varias etapas. La cantidad de bandas y etapas activas es configurable, y la mayoría de los parámetros pueden controlarse 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 proveedores para mejorar el control de los trabajos relacionados con la red.

Los trabajos pueden declarar el tamaño estimado de los datos, la carga previa de indicadores 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 diferir las solicitudes de red grandes. En una red no medida, JobScheduler puede ejecutar trabajos de carga previa para mejorar la experiencia del usuario, como la carga previa de encabezados.

Cuando agregues trabajos, asegúrate de usar setEstimatedNetworkBytes(), setPrefetch() y setRequiredNetwork() cuando corresponda para ayudar a JobScheduler a controlar el trabajo de forma correcta. Cuando se ejecute tu trabajo, asegúrate de usar el objeto Network que muestra JobParameters.getNetwork(). De lo contrario, implícitamente usarás la red predeterminada del dispositivo, que podría no cumplir con tus requisitos y causar un uso no deseado de datos.

API de Neural Networks 1.1

La API de redes neuronales se introdujo en Android 8.1 (nivel de API 27) para acelerar el aprendizaje automático en Android. Android 9 expande y mejora la API, lo que agrega compatibilidad con nueve operaciones nuevas:

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 el resultado de la NNAPI no coincida con el resultado 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 deseas 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 a la hora de completar formularios. Si deseas obtener más información para usar las funciones de autocompletado en tu app, consulta la guía de Autofill Framework.

Mejoras de seguridad

Android 9 presenta 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, la app muestra un mensaje al usuario en el que se le solicita que apruebe una breve declaración. Esta declaración permite a la app reafirmar 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 en clave hash (HMAC). Una vez que Android Keystore confirme la validez del mensaje, tu app podrá usar la clave generada desde trustedConfirmationRequired en el entorno de ejecución confiable (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.

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 nombre de tu app. Esta funcionalidad crea un aspecto y una posición estandarizados para el diálogo, lo que brinda a los usuarios más confianza de que se están autenticando con un verificador de credenciales biométrico de confianza.

Si tu app usa FingerprintManager para mostrar un diálogo de autenticación con huella digital 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ó un usuario.

Módulo de seguridad de hardware

Los dispositivos compatibles que ejecutan Android 9 o versiones posteriores pueden tener un StrongBox Keymaster, una implementación de la HAL de 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 Keymaster, el sistema corrobora la integridad de una clave con el entorno de ejecución confiable (TEE).

Para obtener más información sobre el uso de Strongbox Keymaster, consulta el Módulo de seguridad de hardware.

Importación de claves segura al 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 claves con codificación AN.1. Keymaster luego desencripta las claves en el almacén de claves para que el contenido de estas nunca aparezca como texto simple en la memoria host del dispositivo.

Obtén más información para 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 se firme con un nuevo certificado mediante la vinculación de los certificados de firma anteriores del archivo APK con el que ahora está firmado.

Obtén más información para rotar claves con apksigner.

Opción para permitir la desencriptación de claves solo en dispositivos desbloqueados

Android 9 presenta la marca unlockedDeviceRequired. Esta opción determina si el almacén de claves 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 almacenarán en el disco, como datos empresariales o de salud. La marca proporciona a los usuarios una mayor seguridad de que los datos no se podrán desencriptar mientras el dispositivo esté bloqueado en caso de que lo pierdan o lo roben.

Para mantener una clave segura 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, cualquier intento de desencriptar o firmar datos con esta clave fallará. Un dispositivo bloqueado requiere un PIN, una contraseña, una huella dactilar o algún otro factor de confianza para poder acceder a él.

Compatibilidad con encriptación heredada

Los dispositivos Android 9 que incorporan Keymaster 4 admiten el algoritmo de encriptación triple de datos, o Triple DES. Si tu app interopera con sistemas heredados que requieren Triple DES, usa este tipo de algoritmo de cifrado para encriptar credenciales sensibles.

Si quieres obtener más información para hacer que tu app sea más segura, consulta Seguridad para desarrolladores de Android.

WPS dejó de estar disponible

La Configuración Wi-Fi protegida (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 las copias de seguridad y el restablecimiento. Los detalles sobre estos cambios aparecen en las siguientes secciones.

Copias de seguridad de encriptación del cliente

Android 9 agrega compatibilidad para encriptar copias de seguridad de Android con un secreto del cliente. La compatibilidad se habilita automáticamente cuando se cumplen las siguientes condiciones:

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 realizó el dispositivo del usuario. Para obtener más información sobre la tecnología detrás de esta función, consulta el informe sobre el servicio Google Cloud Key Vault.

Cómo definir las condiciones del dispositivo necesarias para la copia de seguridad

Si los datos de tu app incluyen información sensible o preferencias, 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, como cuando está habilitada la encriptación del cliente o cuando se realiza una transferencia local de un dispositivo a otro.

Para obtener más información sobre cómo crear copias de seguridad de datos en dispositivos Android, consulta la Descripción general de la copia de seguridad de datos.

Accesibilidad

Android 9 introduce mejoras en el framework de accesibilidad que facilitan la entrega de experiencias aún mejores a los usuarios de tu app.

Semántica de navegación

Los atributos agregados en Android 9 facilitan la definición de la manera en que los servicios de accesibilidad, especialmente los lectores de pantalla, navegan de una parte 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 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 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, como cuando una actividad reemplaza un fragmento por otro. Los paneles consisten en elementos de la IU relacionados visualmente y agrupados lógicamente que, por lo general, conforman un fragmento.

En Android 9, puedes proporcionar títulos de paneles de accesibilidad o títulos que puedan identificarse de forma individual para estos paneles. Si un panel tiene un título, los servicios de accesibilidad reciben información más detallada cuando el panel 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 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, 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, 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 de la IU del usuario.

Salida y navegación grupal

Los lectores de pantalla solían usar el atributo android:focusable para determinar cuándo debían leer una ViewGroup o una colección de objetos View como una sola unidad. De esa manera, los usuarios podían comprender que las vistas estaban relacionadas entre sí de forma lógica.

En Android 8.1 y versiones anteriores, debes marcar cada objeto View dentro de una ViewGroup como no enfocable y el ViewGroup en sí 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 que un objeto View sea enfocable tenga consecuencias no deseadas. Los lectores de pantalla se enfocan en todos los elementos que establecieron 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 los cuadros de información
Las funciones adicionales al 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 usa ACTION_SHOW_TOOLTIP y ACTION_HIDE_TOOLTIP para indicar a las instancias de View que muestren u oculten su información sobre la herramienta.
Acciones globales agregadas
Android 9 admite 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 acciones GLOBAL_ACTION_LOCK_SCREEN y GLOBAL_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 ocurra un evento TYPE_WINDOWS_CHANGED, usa la API de getWindowChanges() para determinar cómo cambiaron las ventanas. Durante una actualización de varias ventanas, cada una produce su propio conjunto de eventos. El método getSource() devuelve la vista de 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 ocurre un evento TYPE_WINDOW_STATE_CHANGED, usa los tipos que muestra getContentChangeTypes() para determinar cómo cambió la ventana. Por ejemplo, el framework puede detectar cuándo un panel tiene un título nuevo o cuándo desapareció un panel.

Rotación

Para eliminar las rotaciones accidentales, agregamos un modo que fija la orientación actual incluso si cambia la posición del dispositivo. Cuando sea necesario, los usuarios pueden activar la rotación de forma 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 un comportamiento de rotación personalizado o usa una configuración de orientación de pantalla inusual, podrías tener problemas que antes no habrían notado cuando la preferencia de rotación del usuario siempre estaba configurada en modo vertical. Te recomendamos observar el comportamiento de rotación en todas las actividades clave de tu app y asegurarte de que todas las configuraciones de orientación de la pantalla sigan proporcionando una experiencia óptima.

Para obtener más información, consulta los cambios de comportamiento asociados.

Dispositivo móvil giratorio que muestra un nuevo modo de rotación que permite a los usuarios activar manualmente la rotación

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 ofrece las siguientes funciones relacionadas con texto a la plataforma:

  • Texto procesado previamente: La clase PrecomputedText mejora el rendimiento de la renderización de texto, ya que te permite calcular y almacenar en caché la información necesaria con anticipación. También permite que tu app diseñe el texto a partir del subproceso principal.

  • Lupa: La clase Magnifier es un widget de plataforma que proporciona una API de lupa, lo que permite una experiencia coherente de 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 sugerir que el usuario realice una llamada telefónica usando ese número. Las funciones de TextClassifier reemplazan la funcionalidad de la clase Linkify.

  • Diseño de texto: Hay varios métodos y atributos convenientes que facilitan la implementación del diseño de tu IU. Para obtener más información, consulta la documentación de referencia de TextView.

Conversión de archivos DEX anticipadamente a ART

En dispositivos que ejecutan Android 9 o versiones posteriores, el compilador anticipado 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 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 integrado en el dispositivo

Android 9 te permite registrar los registros del sistema desde tu dispositivo y, luego, compartir un informe de esas grabaciones con tu equipo de desarrollo. Este informe admite varios formatos, incluido HTML.

Si recopilas esos registros, puedes captar datos de latencia relacionados con los subprocesos y procesos de tu app, y ver otros tipos de estados del dispositivo significativos a nivel mundial.

Para obtener más información sobre esta herramienta, consulta Cómo realizar un registro del sistema en el dispositivo.