Características y API de Android 9

Android 9 (nivel de API 28) presenta características y capacidades nuevas para usuarios y desarrolladores. En este documento, se destacan las novedades para desarrolladores.

Para obtener más información sobre las API nuevas, lee el informe de diferencias de las API o consulta la referencia de Android API. Asegúrate de revisar los cambios de comportamiento en Android 9 para obtener información sobre las áreas en las cuales los cambios en la plataforma pueden afectar tus apps.

Posicionamiento en interiores con RTT de Wi-Fi

Las nuevas RTT API admiten posicionamiento en interiores en tus apps.

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

En los dispositivos con Android 9 que dispongan del hardware correspondiente, tus apps podrán usar RTT API para medir la distancia a los puntos de acceso (PA) WiFi cercanos con capacidad para RTT. El dispositivo debe tener los servicios de ubicación habilitados y el escaneo de Wi-Fi activado (en Settings > Location), y tu app debe tener el permiso ACCESS_FINE_LOCATION . No es necesario que el dispositivo se conecte a los puntos de acceso para usar el RTT. Para preservar la privacidad, solo el teléfono puede determinar la distancia hasta el punto de acceso; los puntos de acceso no tienen esta información.

Si tu dispositivo mide la distancia a 3 o más puntos de acceso, puedes usar un algoritmo de multilateración para calcular la posición del dispositivo que mejor se adecue a esas medidas. La precisión del resultado generalmente va de 1 a 2 metros.

Con esta precisión, puedes crear nuevas experiencias; por ejemplo, navegación en instalaciones y servicios específicos basados en la ubicación, como el control de voz inequívoco (por ejemplo, “Encender esta luz”) e información basada en la ubicación (por ejemplo, “¿Hay ofertas especiales relacionadas con este producto?”).

Compatibilidad con recorte de pantalla

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

Prueba de recorte de pantalla con el emulador

Android 9 ofrece compatibilidad con las últimas pantallas de borde a borde que contienen recortes de pantalla para cámaras y altavoces. La clase DisplayCutout te permite encontrar la ubicación y la forma de las áreas no funcionales donde no se debe mostrar el contenido. Para determinar la existencia y la ubicación de estas áreas de recortes, usa el método getDisplayCutout().

Un atributo nuevo de diseño de ventana, layoutInDisplayCutoutMode, permite que tu app muestre su contenido en los recortes de un dispositivo. Puedes fijar este atributo en uno de los siguientes valores:

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

  1. Habilita las opciones para desarrollador.
  2. En la pantalla Developer options, desplázate hacia abajo hasta la sección Drawing y selecciona Simulate a display with a cutout.
  3. Selecciona el tamaño del recorte.

Nota: Te recomendamos probar la visualización del contenido en el área de recorte mediante un dispositivo o emulador con Android 9.

Notificaciones

Android 9 introduce varias mejoras a las notificaciones, y todas están disponibles para los desarrolladores que apunten a niveles de API a partir del 28.

Notificaciones del Centro de Mensajes

MessagingStyle con foto adjunta.

Notificación del Centro de Mensajes

MessagingStyle con respuestas y conversación.

Experiencia de mensajería mejorada

A partir de Android 7.0 (nivel de API 24), era posible agregar una acción para responder a los mensajes o ingresar otro texto directamente desde una notificación. En Android 9, esta característica se mejora con las siguientes optimizaciones:

  • Compatibilidad simplificada con participantes de conversaciones: la clase Person se usa para identificar a la gente que participa en una conversación, incluidos sus avatares y URI. Muchas otras API, como addMessage(), ahora pueden aprovechar la clase Person en lugar de usar una 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. Te recomendamos usar setData() en el mensaje para mostrar una imagen. En el siguiente fragmento de código se demuestra la manera de 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);

  • Guardado de respuestas como borradores: tu app puede obtener el EXTRA_REMOTE_INPUT_DRAFT enviado al sistema cuando un usuario accidentalmente cierra una notificación de mensajería. Puedes usar este elemento adicional para completar previamente los campos de texto de la app, a fin de que los usuarios puedan terminar sus respuestas.

  • Identificación de conversaciones grupales: Puedes usar setGroupConversation() para identificar, de manera deliberada, una conversación como grupal o no grupal.

  • Configuración de la acción semántica para un intent: El método setSemanticAction() te permite dar significado semántico a una acción; entre otros, “marcar como leído”, “borrar” y “responder”.

  • SmartReply: Android 9 es compatible con las mismas respuestas sugeridas que se encuentran disponibles en tu app de mensajería. Usa RemoteInput.setChoices() para proporcionar una matriz de respuestas estándares al usuario.

Configuraciones de canales, transmisiones y el modo No interrumpir

Android 8.0 presentó los canales de notificaciones; estos te permiten crear un canal que el usuario puede personalizar para cada tipo de notificación que desees mostrar. Android 9 simplifica las configuraciones del canal de notificaciones con estos cambios:

  • Bloqueo de grupos de canales: los usuarios ahora pueden bloquear grupos de canales completos dentro de la configuración de notificaciones de una app. Puedes usar el método isBlocked() para identificar bloqueos de grupos y, en consecuencia, no enviar notificaciones para canales de ese grupo.

    Además, tu app puede consultar las configuraciones de grupos de canales actuales con el método nuevo getNotificationChannelGroup().

  • Tipos de intents de transmisión nuevos: el sistema de Android envía intents de transmisión cuando se producen cambios en el estado de bloqueo de los canales de notificación y los grupos de canales. La app a la que pertenece el canal o el grupo bloqueado puede detectar estas intents y reaccionar de manera apropiada. Para obtener más información sobre las acciones y los elementos adicionales de estas intents, consulta la lista de constantes actualizados en la referencia de NotificationManager. Para obtener información sobre cómo reaccionar ante las intents de transmisión, consulta Transmisiones.

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

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

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

En dispositivos con Android 9, puedes acceder de forma simultánea a transmisiones de dos o más cámaras físicas. En dispositivos con dos cámaras frontales o posteriores, puedes crear características innovadoras que no serían posibles con una sola cámara, como el zoom uniforme, el bokeh y la visión estéreo. La API también permite llamar a una transmisión de cámara lógica o fusionada que automáticamente alterna entre dos o más cámaras.

Entre otras mejoras en la cámara, se incluyen parámetros de sesión adicionales que ayudan a reducir demoras durante la captura inicial, y el uso compartido en Surface, que permite a los clientes de la cámara manejar varios casos de uso sin necesidad de detener e iniciar la transmisión de esta. También agregamos API para brindar compatibilidad con flash basada en la pantalla y acceso a marcas de tiempo OIS para lograr estabilidad en la imagen y efectos especiales en el nivel de la app.

En Android 9, la multi-camera API admite cámaras monocromáticas para dispositivos compatibles con FULL o LIMITED. La salida monocromática se logra mediante el formato YUV_420_888 con Y como escala de grises, U (Cb) como 128, y V (Cr) como 128.

Android 9 también habilita la asistencia para cámaras externas USB y UVC en dispositivos compatibles.

ImageDecoder para elementos de diseño y mapas de bits

Android 9 introduce la clase ImageDecoder que proporciona un enfoque modernizado para la decodificación de imágenes. Utiliza esta clase en lugar de las API BitmapFactory y BitmapFactory.Options.

ImageDecoder te permite crear un Drawable o un Bitmap a partir de un búfer de bytes, un archivo o un URI. Para decodificar una imagen, primero llama a createSource() con la fuente de la imagen codificada. Luego, llama a decodeDrawable() o decodeBitmap() pasando el objeto ImageDecoder.Source para crear un Drawable] o un Bitmap. Para cambiar la configuración predeterminada, pasa OnHeaderDecodedListener a decodeDrawable() o decodeBitmap(). ImageDecoder llama a onHeaderDecoded() con el alto y el ancho predeterminado de la imagen, una vez que los conozcas. Si la imagen codificada es de formato GIF o WebP animado, decodeDrawable() muestra un Drawable que es una instancia de la clase AnimatedImageDrawable.

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

  • Para aplicar un ajuste a escala de la imagen decodificada a un tamaño exacto, pasa las dimensiones de destino a setTargetSize(). También puedes aplicar ajustes a escala a las imágenes usando un tamaño de muestra. Pasa el tamaño de muestra directamente 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 complejos a una imagen, como esquinas redondeadas o máscaras circulares. Usa setPostProcessor() con una instancia de la clase PostProcessor para ejecutar los comandos de dibujos que desees.

Nota: Cuando posprocesas un AnimatedImageDrawable, los efectos aparecen en todos los marcos de la animación.

Animación

Android 9 introduce la clase AnimatedImageDrawable para dibujar y mostrar imágenes animadas GIF y WebP. AnimatedImageDrawable funciona de manera similar a AnimatedVectorDrawable en cuanto a que el subproceso de representación impulsa las animaciones de AnimatedImageDrawable. El subproceso de representación usa también un subproceso de trabajo para decodificar, de modo que la decodificación no interfiera con otras operaciones en el subproceso de representación. Esta implementación permite que tu app muestre una imagen animada sin administrar sus actualizaciones ni interferir con otros eventos en el subproceso de la IU de tu app.

Se puede decodificar un AnimatedImageDrawable usando una instancia de ImageDecoder. En el siguiente fragmento de código se muestra la manera de usar ImageDecoder para decodificar tu AnimatedImageDrawable:

Kotlin

@Throws(IOException::class)
private fun decodeImage() {
    val decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(resources, R.drawable.my_drawable))

    // Prior to start(), the first frame is displayed.
    (decodedAnimation as? AnimatedImageDrawable)?.start()
}

Java

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.
        ((AnimatedImageDrawable) decodedAnimation).start();
    }
}

ImageDecoder tiene varios métodos que te permiten aplicar más modificaciones a la imagen. Por ejemplo, puedes usar el método setPostProcessor() para modificar la apariencia de la imagen; por ejemplo, aplicar una máscara circular o esquinas redondeadas.

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

Android 9 incorpora compatibilidad integrada con rango dinámico alto (HDR) VP9 Perfil 2 para que ahora puedas ofrecer películas en HDR a tus usuarios en YouTube, Play Movies y otros recursos en dispositivos que admitan HDR.

En Android 9 se agrega compatibilidad con codificación de imágenes HEIF (heic) a la plataforma. Las muestras de imágenes HEIF estáticas se admiten en las clases MediaMuxer y MediaExtractor. El formato HEIF mejora la compresión para el guardado en un medio de almacenamiento y datos de red. Con dispositivos Android 9 compatibles con la plataforma, enviar y utilizar imágenes HEIF desde tus servidores backend es fácil. Una vez que te asegures de que tu app sea compatible con este formato de datos para compartir y mostrar contenido, prueba el HEIF como formato de almacenamiento de imágenes en tu app. Puedes realizar una conversión de jpeg a heic usando ImageDecoder o BitmapFactory para obtener un mapa de bits a partir de jpeg, y usar HeifWriter para escribir imágenes HEIF estáticas desde el búfer de bytes YUV, Surface o un mapa de bits.

Las métricas de medios también se encuentran disponibles en las clases AudioTrack, AudioRecord y MediaDrm.

En Android 9 se agregan métodos a la clase MediaDRM para obtener métricas, niveles de HDCP , niveles de seguridad y varias sesiones, agregar más control a los niveles de seguridad y ofrecer seguridad en las detenciones. Para obtener más información, consulta el informe de diferencias de API.

En Android 9, la AAudio API incluye atributos AAudioStream para uso, tipo de contenido, y valores de entrada preestablecidos. Con estos atributos, podrás crear transmisiones adaptadas para aplicaciones de VoIP o videocámara. También puedes configurar el SessionID para asociar una transmisión AAudio con una submezcla que puede incluir efectos. Usa AudioEffect API para controlar los efectos.

Android 9 incluye una API AudioEffect para DynamicsProcessing. Con esta clase puedes compilar efectos de audio basados en canales compuestos por varias etapas de diferentes tipos, entre las que se incluyen la ecualización, la compresión multibanda y el limitador. La cantidad de bandas y etapas creativas puede configurarse, y la mayoría de los parámetros pueden controlarse en tiempo real.

Sensibilidad al costo de datos en JobScheduler

A partir de Android 9, JobScheduler puede usar las señales de estado de red proporcionadas por los proveedores para mejorar el manejo de trabajos relacionados con la red.

Las tareas pueden declarar el tamaño estimado de los datos, la búsqueda anticipada de señal, y especificar requisitos de red detallados. JobScheduler luego administra el trabajo de acuerdo con el estado de la red. Por ejemplo, cuando la red indique que está congestionada, JobScheduler podría diferir las solicitudes de red de gran magnitud. Cuando una red es no medida, JobScheduler puede ejecutar trabajos de captura previa para mejorar la experiencia del usuario, como la captura previa de encabezados.

Al agregar trabajos, asegúrate de usar setEstimatedNetworkBytes(), setPrefetch() y setRequiredNetwork() cuando corresponda para ayudar a JobScheduler a manejar la tarea de forma apropiada. Cuando se ejecute tu trabajo, asegúrate de usar el objeto Network que muestre JobParameters.getNetwork(). De lo contrario, implícitamente usarás la red predeterminada del dispositivo, que podría incumplir con tus requisitos y hacer que se usen datos de manera no intencionada.

Neural Networks API 1.1

La Neural Networks API se presentó en Android 8.1 (nivel de API 27) para acelerar el aprendizaje automático en Android. Android 9 expande y mejora la API, agregando asistencia para nueve operaciones nuevas:

Problema conocido: Al pasar ANEURALNETWORKS_TENSOR_QUANT8_ASYMM tensores a la operación ANEURALNETWORKS_PAD , disponible en Android 9 y versiones posteriores, es posible que el resultado de NNAPI no coincida con el resultado de los marcos de trabajo de aprendizaje automático de nivel superior, como TensorFlow Lite. En su lugar, solo debes pasar ANEURALNETWORKS_TENSOR_FLOAT32 hasta que se resuelva el problema.

Además, la API también introduce una función nueva, ANeuralNetworksModel_relaxComputationFloat32toFloat16(), que te permite especificar si deseas calcular ANEURALNETWORKS_TENSOR_FLOAT32 con un rango de precisión tan bajo como el del formato de punto flotante IEEE 754 de 16 bits.

Autofill Framework

En Android 9, se introducen varias mejoras que los servicios de autocompletar pueden implementar para mejorar aún más la experiencia del usuario al completar formularios. Para obtener más información sobre cómo usar características de autocompletado en tu app, consulta la guía de Autofill Framework.

Mejoras de seguridad

En Android 9, se incluyen varias características de seguridad que se resumen en las siguientes secciones:

Confirmación de protección de Android

Los dispositivos compatibles que tienen Android 9 o versiones posteriores te permiten usar la confirmación de protección de Android. Cuando se usa este flujo de trabajo, tu app muestra un aviso al usuario en el que se le solicita aprobar una declaración corta. Esta declaración permite a la app ratificar que el usuario desea completar una transacción confidencial, como un pago.

Si el usuario acepta la declaración, Android Keystore recibe y guarda una firma criptográfica protegida por un código de autenticación de mensajes de hash con clave (HMAC). Después de que Android Keystore confirma la validez del mensaje, tu app puede usar la clave generada por trustedConfirmationRequired en el entorno de ejecución seguro (TEE) para firmar el mensaje que el usuario aceptó. La firma indica, con un alto grado de confianza, que el usuario vio la declaración y la aceptó.

Advertencia: La confirmación de protección de Android no proporciona un canal de información seguro para el usuario. Tu app no podrá prever ninguna garantía de confidencialidad más allá de las que ofrece la plataforma Android. En especial, no uses este flujo de trabajo para mostrar información confidencial que no mostrarías normalmente en el dispositivo del usuario.

Para obtener orientación sobre cómo agregar compatibilidad con la confirmación de protección de Android, consulta la guía Confirmación de protección de Android .

Diálogo de autenticación biométrica unificada

En Android 9, el sistema proporciona diálogos de autenticación biométrica en representación de tu app. Esta característica crea una apariencia y ubicación estandarizadas para el diálogo, lo que brinda a los usuarios mayor confianza de que la autenticación se realiza con un verificador de credenciales biométrico.

Si tu app usa FingerprintManager para mostrar un diálogo de autenticación por huellas dactilares a los usuarios, usa en su lugar BiometricPrompt . BiometricPrompt depende del sistema para mostrar el diálogo de autenticación. También cambia su conducta para adaptarse al tipo de autenticación biométrica que el usuario eligió.

Nota: Antes de aplicar BiometricPrompt en tu app, debes usar primero el método hasSystemFeature() para asegurarte de que el dispositivo admita FEATURE_FINGERPRINT, FEATURE_IRIS o FEATURE_FACE. Si un dispositivo no admite la autenticación biométrica, puedes recurrir a la verificación del PIN, el patrón o la contraseña de un usuario con el método createConfirmDeviceCredentialIntent() .

Módulo de seguridad de hardware

Los dispositivos admitidos con Android 9 instalado, o versiones posteriores, pueden tener un StrongBox Keymaster, una implementación del Keymaster HAL que reside en un módulo de seguridad de hardware. El módulo contiene lo siguiente:

  • Su propia CPU.
  • Almacenamiento seguro.
  • Un generador de números aleatorios reales.
  • Mecanismos adicionales de resistencia contra alteraciones de paquetes e instalaciones de prueba no autorizadas de apps.

Cuando se verifican las claves almacenadas en el StrongBox Keymaster, el sistema corrobora la integridad de una clave con el entorno de ejecución seguro (TEE).

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

Importar claves al Keystore de forma segura

Android 9 proporciona seguridad adicional en la desencriptación de claves, ya que agrega la capacidad de importar claves encriptadas de forma segura al Keystore, usando un formato de clave con codificación ASN.1‑. El Keymaster luego descifra las claves en el Keystore, para que el contenido de estas nunca aparezca como texto sin formato en la memoria host del dispositivo.

Nota: Esta característica se admite únicamente en los dispositivos que incorporan Keymaster 4 o una versión posterior.

Obtén más información sobre cómo importar claves encriptadas de forma más segura.

Esquema de firma de APK con rotación de claves

En Android 9 se incluye compatibilidad con el esquema de firma de APK v3. Este esquema tiene la opción de incluir un registro de prueba de rotación en su bloque de firma para cada certificado de firma. Esta capacidad permite que tu app pueda firmarse con un certificado de firma nuevo mediante la vinculación de los certificados anteriores del archivo APK con el certificado con el cual está firmado actualmente.

Nota: Los dispositivos con Android 8.1 (nivel de API 27) o versiones anteriores no admiten el cambio del certificado de firma. Si la minSdkVersion de tu app es 27 o anterior, usa un certificado de firma anterior para firmar tu app, además de la firma nueva.

Obtén más información sobre cómo rotar claves usando apksigner.

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

Android 9 presenta el indicador unlockedDeviceRequired. Esta opción determina si el Keystore requiere el desbloqueo de la pantalla antes de permitir la desencriptación de cualquier dato en desarrollo o almacenado usando la clave especificada. Estos tipos de clave son aptas para encriptar datos confidenciales que se almacenarán en el disco, como información de salud o empresarial. El indicador proporciona a los usuarios una mayor seguridad de que los datos no podrán desencriptarse mientras el dispositivo esté bloqueado en caso de que lo pierdan o se los hayan robado.

Nota: Cuando el indicador unlockedDeviceRequired está habilitado, la encriptación y la verificación de firma aún pueden tener lugar en cualquier momento. El indicador evita únicamente la desencriptación de datos cuando el dispositivo está desbloqueado.

Para mantener una clave segura de la desencriptación mientras el dispositivo está bloqueado, habilita el indicador pasando true al método setUnlockedDeviceRequired() . Después de completar este paso, cuando la pantalla del usuario esté bloqueada, cualquier intento de desencriptar o firmar datos usando esta clave fallará. Un dispositivo bloqueado requiere un PIN, una contraseña, una huella dactilar u otro factor de seguridad para poder acceder a él.

Compatibilidad con encriptación heredada

Los dispositivos con Android 9 que incorporan Keymaster 4 admiten el algoritmo de triple estándar de encriptación de datos, o Triple DES. Si tu app funciona de manera integrada con sistemas heredados que requieren Triple DES, usa este tipo de encriptación para encriptar credenciales confidenciales.

Para obtener más información sobre cómo hacer que tu app sea más segura, consulta Seguridad para desarrolladores de Android.

Copias de seguridad de Android

Android 9 agrega nueva funcionalidad y opciones para desarrolladores en relación con la copia de seguridad y la restauración. En las siguientes secciones se detallan esos cambios.

Copias de seguridad de encriptación del cliente

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

Cuando se habilita esta medida de privacidad, se necesita el PIN, el patrón o la contraseña del dispositivo para restaurar los datos de las copias de seguridad que realiza el dispositivo del usuario. Para obtener más información sobre la tecnología que hizo posible esta característica, consulta el documento Servicio Cloud Key Vault de Google.

Definir las condiciones del dispositivo necesarias para la copia de seguridad

Si los datos de tu app incluyen información confidencial o preferencias, Android 9 te da la posibilidad de definir las condiciones del dispositivo bajo las que se incluyen los datos de tu app en la copia de seguridad del usuario, como cuando se habilita la encriptación del cliente o se produce una transferencia local de un dispositivo a otro.

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

Accesibilidad

Android 9 introduce en el marco de trabajo de accesibilidad mejoras que facilitan la oferta de experiencias mucho mejores a los usuarios de tu app.

Semántica de navegación

Los atributos agregados a Android 9 facilitan la definición de la manera en que los servicios de accesibilidad, especialmente los lectores de pantalla, navegan de una parte de esta a otra. Estos atributos pueden ayudar a los usuarios con problemas visuales a desplazarse rápidamente por el texto en la IU de tu app y les permiten realizar una selección.

Por ejemplo, en una app de compras, un lector de pantalla puede ayudar a los usuarios a navegar directamente de una categoría de ofertas a la siguiente, sin que el lector de pantalla deba leer todos los elementos de una categoría antes de pasar a la siguiente.

Títulos de subpaneles de accesibilidad

En Android 8.1 (nivel de API 27) y versiones anteriores, los servicios de accesibilidad no siempre pueden determinar cuándo se actualizó un subpanel específico de la pantalla, como cuando una actividad reemplaza un fragmento por otro. Los subpaneles consisten en elementos de la IU relacionados visualmente y agrupados lógicamente que en general incluyen un fragmento.

En Android 9, puedes proporcionar títulos de subpaneles de accesibilidad o títulos que puedan identificarse individualmente para estos subpaneles. Si un subpanel tiene un título para el subpanel de accesibilidad, los servicios de accesibilidad reciben información más detallada cuando el subpanel cambia. Esta capacidad permite que los servicios proporcionen información más detallada al usuario sobre lo que cambia en la IU.

Para especificar el título de un subpanel, usa el atributo android:accessibilityPaneTitle . También puedes actualizar el título de un subpanel de la IU que se reemplace en el tiempo de ejecución usando setAccessibilityPaneTitle(). Por ejemplo, puedes proporcionar un título para el área de contenido de un objeto Fragment.

Navegación basada en encabezados

Si tu app muestra contenido textual que incluye encabezados lógicos, fija el atributo android:accessibilityHeading en true para las instancias de View que representen esos encabezados. Al agregar estos encabezados, permites que los servicios de accesibilidad ayuden a los usuarios a navegar directamente de un encabezado al siguiente. Cualquier servicio de accesibilidad puede usar esta capacidad para mejorar la experiencia de navegación del usuario en la IU.

Salida y navegación grupal

Los lectores de pantalla tradicionalmente han usado el atributo android:focusable para determinar el momento en el que debían leer un ViewGroup o un conjunto de objetos View como una sola unidad. De esa manera, los usuarios podían comprender que las vistas se relacionaban lógicamente entre sí.

En Android 8.1 y versiones anteriores, debes marcar cada objeto View dentro de un ViewGroup como no enfocable y el ViewGroup como enfocable. Esta disposición hizo que algunas instancias de View se marcaran como enfocables de una manera que hacía más engorrosa la navegación con teclado.

A partir de Android 9, puedes usar el atributo android:screenReaderFocusable en lugar del atributo android:focusable en situaciones en las que hacer enfocable un objeto View tenga consecuencias no deseadas. Los lectores de pantalla se enfocan en todos los elementos que fijen android:screenReaderFocusable o android:focusable en true.

Acciones de conveniencia

Android 9 incorpora asistencia para las acciones de conveniencia en representación de los usuarios:

Interacción con información sobre herramientas
Las características agregadas al marco de trabajo de accesibilidad te brindan acceso a información sobre herramientas en la IU de una app. Usa getTooltipText() para leer el texto de información sobre herramientas, y ACTION_SHOW_TOOLTIP y ACTION_HIDE_TOOLTIP para indicarles a las instancias de View que muestren u oculten su información sobre herramientas.
Acciones globales agregadas
En Android 9 se introduce asistencia para dos acciones de dispositivo adicionales en la clase AccessibilityService. Tu servicio puede ayudar a los usuarios a bloquear sus dispositivos y tomar capturas de pantalla usando las acciones GLOBAL_ACTION_LOCK_SCREEN y GLOBAL_ACTION_TAKE_SCREENSHOT respectivamente.

Detalles sobre modificaciones de ventanas

Android 9 facilita el seguimiento de actualizaciones en las ventanas de una app cuando esta vuelve a dibujar varias ventanas de manera simultánea. Cuando tenga lugar un evento TYPE_WINDOWS_CHANGED, usa la API getWindowChanges() para determinar cómo se han modificado las ventanas. Durante la actualización de varias ventanas, cada una de estas produce su propio conjunto de eventos. El método getSource() muestra la vista raíz de la ventana asociada con cada evento.

Si una app define títulos de subpaneles de accesibilidad para sus objetos View, tu servicio puede reconocer los casos en los que se actualice la IU de la app. Cuando se produzca un evento TYPE_WINDOW_STATE_CHANGED, usa los tipos que muestre getContentChangeTypes() para determinar el modo en que se modificó la ventana. Por ejemplo, el marco de trabajo ahora puede detectar los casos en que un subpanel tiene un título nuevo o desaparece.

Rotación

Para eliminar las rotaciones involuntarias, hemos agregado un modo nuevo que fija la orientación actual aun cuando se modifica la posición del dispositivo. Cuando sea necesario, los usuarios pueden activar la rotación de manera manual presionando un botón en la barra del sistema.

En la mayoría de los casos, el impacto de compatibilidad para las apps es mínimo. Sin embargo, si tu app tiene algún comportamiento de rotación personalizado o usa una configuración de orientación de pantalla poco común, podrías experimentar problemas que anteriormente puedan haber pasado inadvertidos al estar siempre fija en el modo de retrato la preferencia de rotación del usuario. Te sugerimos observar el comportamiento de rotación en todas las actividades principales de tu app y asegurarte de que todas las configuraciones de orientación de pantalla aún proporcionen la experiencia óptima.

Para obtener información detallada, consulta los cambios de comportamiento asociados.

Un modo nuevo de rotación permite a los usuarios activar la rotación de modo manual, cuando sea necesaria, mediante un botón de la barra del sistema.

Texto

Android 9 aporta las siguientes características relacionadas con texto a la plataforma:

  • Texto previamente calculado: la clase PrecomputedText mejora el rendimiento de la representación de texto permitiéndote calcular y almacenar en caché la información necesaria con antelación. También permite que tu app diseñe el texto a partir del subproceso principal.

  • Lupa: la clase Magnifier es un widget de la plataforma que proporciona una API de lupa, lo cual proporciona una experiencia uniforme de la característica lupa en todas las apps.

  • Vinculación inteligente: Android 9 mejora la clase TextClassifier, que aprovecha el aprendizaje automático para identificar algunas entidades en el texto seleccionado y sugerir acciones. Por ejemplo, TextClassifier puede permitir que tu app determine si el usuario ha seleccionado un número de teléfono. Luego, tu app puede sugerir que el usuario realice una llamada telefónica usando ese número. Las características de TextClassifier reemplazan la funcionalidad de la clase Linkify.

  • Disposición del texto: hay varios métodos y atributos convenientes que facilitan la implementación del diseño de tu IU. Si deseas obtener información detallada, consulta la documentación de referencia para TextView.

Conversión de archivos DEX predefinida de ART

En dispositivos con Android 9 o versiones posteriores, el compilador predefinido del tiempo de ejecución de Android (ART) optimiza aún más los archivos comprimidos en formato Dalvik Executable (DEX) convirtiendo los archivos DEX de un paquete de apps en una representación más compacta. Este cambio permite que tu app se inicie más rápido y ocupe menos espacio en disco y memoria RAM.

Esta mejora beneficia particularmente a dispositivos de gama baja con velocidades de entrada y salida de disco menores.

Seguimiento del sistema en el dispositivo

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

Al recopilar esos seguimientos, puedes capturar datos de sincronización relacionados con los procesos y subprocesos de tu app, y ver otros tipos de estados de dispositivos importantes a nivel global.

Nota: No necesitas instrumentar tu código para registrar seguimientos, pero hacerlo puede ayudarte a ver las partes del código de tu app que podrían contribuir a bloquear los subprocesos o la IU.

Para obtener más información sobre esta herramienta, consulta Realizar un seguimiento del sistema en el dispositivo.