Funciones y APIs 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 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

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

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

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 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:

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 incluye varias mejoras en las notificaciones, todas disponibles para los desarrolladores que segmentan sus apps para 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 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, como addMessage(), ahora aprovechan la clase Person en lugar de un 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 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 objeto Person 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:

  • NotificationManager.Policy también tiene siete nuevas constantes de No interrumpir que puedes usar para suprimir las interrupciones visuales:

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 a setTargetSampleSize().
  • Para recortar una imagen dentro del rango de la imagen escalada, llama a setCrop().
  • Para crear un mapa de bits mutable, pasa true a setMutableRequired().

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:

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:

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 utiliza ACTION_SHOW_TOOLTIP y ACTION_HIDE_TOOLTIP para indicar instancias de View 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 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 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.

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 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 en TextClassifier reemplazan la funcionalidad de la clase Linkify.

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