Características y API de Android 9

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 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 de Wi-Fi (RTT), para que puedas aprovechar el posicionamiento en interiores en tus apps.

En los dispositivos que ejecutan Android 9 compatibles con hardware, las apps pueden usar las API 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 activada (en Configuración > Ubicación), 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 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 instalaciones y servicios específicos basados en la ubicación, como el control por voz inequívoco (por ejemplo, "Enciende esta luz") e información basada en la ubicación (como "¿Hay ofertas especiales para este producto?").

Consulta la API de Wi-Fi RTT que se usa en la app de demostración 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 más recientes de borde a borde 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 se orientan al nivel de API 28 y versiones posteriores.

Notificaciones del Centro de Mensajes

MessagingStyle con foto adjunta.

Notificación de mensajería

MessagingStyle con respuestas y conversación.

Para ver un código de muestra que usa notificaciones, incluidas las funciones de Android 9, consulta Ejemplo de personas.

Experiencia de mensajería mejorada

A partir de Android 7.0 (nivel de API 24), podías 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 participantes de una 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, 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 una 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 accidental. Puedes usar este extra para prepropagar 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 deliberadamente una conversación como grupal o no grupal.

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

  • SmartRespuesta: 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 dentro de 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 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 a la que pertenece el grupo o el canal bloqueado puede escuchar estos intents y reaccionar en consecuencia. Para obtener más información sobre estas acciones de intent y otros elementos adicionales, 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 molestar.

  • 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.

Entre otras mejoras de la cámara, se incluyen parámetros de sesión adicionales, que ayudan a reducir los retrasos durante la captura inicial, y uso compartido de superficies que permite a los clientes de la cámara controlar 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 los efectos especiales a 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 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 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 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 animado o WebP, 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 escalar la imagen decodificada a un tamaño exacto, pasa las dimensiones objetivo 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, ya 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 con otros eventos en el subproceso de IU de tu app.

Un AnimatedImageDrawable se puede decodificar 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 seguir modificando la imagen. Por ejemplo, puedes usar el método setPostProcessor() para modificar la apariencia 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 alto rango dinámico (HDR) VP9 Perfil 2 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 con la codificación de imágenes mediante 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 HEIF son compatibles con las clases MediaMuxer y MediaExtractor. Gracias a la compatibilidad con 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 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 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 introduce métodos en la clase MediaDRM para obtener métricas, niveles de HDCP, niveles de seguridad y cantidad de sesiones, así como agregar más control sobre los niveles de seguridad y detenciones seguras. Consulta el informe de diferencias de 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 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 se puede configurar, 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 indicadores de estado de red proporcionados por proveedores para mejorar el manejo de trabajos relacionados con la red.

Las tareas pueden declarar el tamaño estimado de los datos, la carga previa de los indicadores y especificar los 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. Cuando se usa 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 sea apropiado para ayudar a JobScheduler a manejar el trabajo correctamente. 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 intencionado 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, y 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 NNAPI no coincida con el resultado de 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 función nueva, ANeuralNetworksModel_relaxComputationFloat32toFloat16(), que te permite especificar si deseas calcular ANEURALNETWORKS_TENSOR_FLOAT32 con un rango y una precisión tan baja como la 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 completan 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 usas este flujo de trabajo, tu app muestra un mensaje al usuario en el que se le solicita aprobar una declaración breve. 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 en clave hash (HMAC). Una vez 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 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 podrá prever ninguna garantía 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 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 una apariencia y posición estandarizadas 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étricos confiable.

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ó 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 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.

Importación segura de claves 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 con un formato de claves con codificación AN.1. El Keymaster luego desencripta las claves en el almacén de claves, para que su contenido nunca aparezca como texto sin formato 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 función 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 está firmado actualmente.

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 mediante 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 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, 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 de datos triples, o Triple DES. Si tu app funciona de manera integrada con sistemas heredados que requieren Triple DES, usa este tipo de algoritmo de cifrado para encriptar credenciales sensibles.

Para obtener más información sobre cómo 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 la copia 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 necesita el PIN, el patrón o la contraseña del dispositivo para restablecer los datos de las copias de seguridad que realiza el dispositivo del usuario. Para obtener más información sobre la tecnología detrás de esta función, consulta el informe del 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 produce una transferencia local de un dispositivo a otro.

Para obtener más información sobre cómo crear una copia de seguridad de 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 permiten brindar con mayor facilidad 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, en especial los lectores de pantalla, navegan de una parte a otra. Estos atributos pueden ayudar a los usuarios con discapacidad visual a moverse 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, 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, comprenden un fragmento.

En Android 9, puedes proporcionar títulos de paneles de accesibilidad o títulos de identificación individual para estos paneles. Si un panel tiene un título para el panel de accesibilidad, los servicios de accesibilidad recibirán información más detallada cuando el panel cambie. Esta función 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 de texto 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 de los usuarios.

Navegación y salida de grupo

Los lectores de pantalla tradicionalmente usaban el atributo android:focusable para determinar cuándo deberían leer un 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 lógicamente entre sí.

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 enfocable un objeto View tiene 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 información sobre herramientas
Las funciones adicionales del 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 indicarles a las instancias de View que oculten o muestren su información.
Acciones globales agregadas
Android 9 admite dos acciones adicionales del dispositivo 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 manera simultánea. Cuando se produzca un evento TYPE_WINDOWS_CHANGED, usa la API de getWindowChanges() para determinar cómo cambiaron las ventanas. Durante la actualización de varias ventanas, cada una 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 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 produzca 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 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. 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, es posible que encuentres problemas que antes no hubieran 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 la experiencia óptima.

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

Rotación del dispositivo móvil que muestra un nuevo modo de rotación que permite a los usuarios activar la rotación de forma manual

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 procesar y almacenar en caché la información necesaria con anticipación. También permite que tu app diseñe el 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 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 con 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 anticipada de archivos DEX de ART

En dispositivos que ejecutan Android 9 o versiones posteriores, el compilador anticipado de Android Runtime (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 consuma menos espacio en el disco y RAM.

Esta mejora beneficia particularmente a 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 capturar registros del sistema desde tu dispositivo y, luego, compartir un informe de esas grabaciones con tu equipo de desarrollo. El informe admite varios formatos, incluido HTML.

Si recopilas estos seguimientos, puedes capturar datos de latencia relacionados con los subprocesos y procesos de tu app, y ver otros tipos de estados del dispositivo importantes a nivel global.

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