Funciones y APIs de Android 9

Android 9 (nivel de API 28) presenta 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 API o visita Referencia de la API de Android. No olvides echar un vistazo Cambios de comportamiento en Android 9 para obtener información sobre las áreas en las que los cambios en la plataforma pueden afectar a 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 suma una plataforma compatible 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 con Android 9 que dispongan del hardware correspondiente, tus apps podrán usar las APIs de RTT para medir la distancia a los puntos de acceso (PA) Wi-Fi cercanos con capacidad para 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 a la 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, como la navegación en instalaciones y servicios específicos basados en la ubicación, 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 WiFi RTT en uso en la app de demostración Android WifiRttScan.

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

Compatibilidad con corte de pantalla

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

Cómo probar el recorte de pantalla con el emulador

Android 9 ofrece compatibilidad con las pantallas de borde a borde más recientes que contengan cortes de pantalla para cámaras y bocinas. El DisplayCutout te permite averiguar la ubicación y la forma de las áreas no funcionales en las que el contenido no debe mostrarse. Para determinar la existencia y la ubicación de estas áreas de corte, usa el getDisplayCutout() .

Un nuevo atributo de diseño de ventana, layoutInDisplayCutoutMode, permite que tu app muestre su contenido en los recortes de un dispositivo. Puedes establecer 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 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 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 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 la Personas Ejemplo.

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. Mejoras de Android 9 esta función con las siguientes mejoras:

  • Compatibilidad simplificada con participantes de conversaciones: 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 aprovecha 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 mensajes 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 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);
  • Guardar respuestas como borradores: Tu app puede recuperar el EXTRA_REMOTE_INPUT_DRAFT que envía el sistema cuando un usuario cierra accidentalmente una notificación de mensajería. Puedes usar este extra para prepropagar campos de texto en la app, de modo que los usuarios puedan terminar su respuesta.

  • Identifica si una conversación es grupal: puedes usar setGroupConversation() para identificar intencionalmente una conversación como grupal o no grupal.

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

  • Respuesta inteligente: Android 9 admite las mismas respuestas sugeridas que están 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 el modo No interrumpir

Android 8.0 presentó los canales de notificación, que 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 cuándo se bloquea un grupo y, como resultado, no enviar notificaciones para los canales de ese grupo.

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

  • Nuevos tipos de intents de transmisión: El sistema Android ahora 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 estas acciones y extras de intent, consulta la lista de constantes actualizada en la NotificationManager referencia. 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 interrumpir:

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

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

En dispositivos que ejecutan Android 9, puedes acceder a las transmisiones simultáneamente de dos o más usuarios cámaras. En dispositivos con dos cámaras frontales o posteriores, puedes crear funciones innovadoras que no son posibles con una sola cámara, como zoom, bokeh y visión estéreo. La API también te permite llamar a una lógica transmisión de cámara que alterna automáticamente 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 la cámara. También agregamos API para flash basado en pantallas asistencia y el acceso a OIS marcas de tiempo para lograr estabilización de imagen y efectos especiales a nivel de la app.

En Android 9, la pantalla multicámara API admite cámaras monocromáticas para dispositivos con FULL o LIMITED. La salida monocromática se logra a través del YUV_420_888 con Y como escala de grises, U (Cb) como 128 y V (Cr) como 128.

Android 9 también admite la compatibilidad con USB/UVC externos cámaras activadas 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. Usar esta clase en lugar de BitmapFactory y BitmapFactory.Options APIs

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 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 llamada onHeaderDecoded() con el ancho y la altura predeterminados 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. Pasar 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 complejos a una imagen, como esquinas redondeadas o máscaras circulares. Usa setPostProcessor() con una instancia del PostProcessor para ejecutar los comandos de dibujo que desees.

Animación

Android 9 presenta 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 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 la IU de tu app.

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

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

Android 9 ofrece compatibilidad integrada con Alto rango dinámico (HDR) VP9 Perfil 2, para que puedas publicar películas compatibles con HDR desde YouTube, Play Películas y otras fuentes en dispositivos compatibles con HDR.

En Android 9, también se agrega compatibilidad para codificar imágenes con la imagen de alta eficiencia Formato de archivo (HEIF) o HEIC), que mejora la compresión y reduce el espacio de almacenamiento y los datos de red de uso de la nube. Las muestras de imágenes fijas HEIF se admiten en las clases MediaMuxer y MediaExtractor. Con dispositivos Android 9 compatibles con la plataforma, es fácil enviar y usar imágenes HEIF de tu servidor backend. Después de asegurarte 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 HEIF con ImageDecoder o BitmapFactory (que obtiene un mapa de bits a partir de un archivo JPEG). Luego, puedes usar HeifWriter para escribir el HEIF imágenes estáticas de búferes de bytes YUV, o instancias de Surface o Bitmap

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

Android 9 presenta métodos a la clase MediaDRM para obtener métricas, niveles de HDCP, niveles de seguridad y varias sesiones, y agregar más control sobre los niveles de seguridad y las detenciones seguras. Consulta las diferencias de API para obtener más información.

En Android 9, la API de AAudio agrega compatibilidad con varios atributos AAudioStream adicionales, incluidos el uso, el tipo de contenido y el valor de entrada preestablecido. Con estos atributos, puedes crear transmisiones adaptadas para aplicaciones de VoIP o videocámara. También puedes establecer el ID de sesión en asociar una transmisión de AAudio con una submezcla que puede incluir efectos. Usa el API de AudioEffect para controlar el efectos.

En Android 9, se introduce la API de AudioEffect para el procesamiento de dinámica. Con esta clase, puedes crear efectos de audio basados en el canal, como los siguientes: ecualizador, compresión multibanda y limitador, en varias etapas. La cantidad de bandas y etapas creativas puede configurarse, 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 las señales de estado de red proporcionadas por los operadores para mejorar el manejo de tareas relacionadas con la red.

Los trabajos pueden declarar el tamaño estimado de los datos, la carga previa de indicadores, y los requisitos de red detallados. Luego, JobScheduler 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 se usa un red no medida, JobScheduler puede ejecutar trabajos de carga previa para mejoran la experiencia del usuario, por ejemplo, mediante la carga previa de los titulares.

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

API de Neural Networks 1.1

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

Problema conocido: Al pasar ANEURALNETWORKS_TENSOR_QUANT8_ASYMM tensores a la ANEURALNETWORKS_PAD que está disponible en Android 9 y versiones posteriores, Es posible que el resultado de la NNAPI no coincida con el resultado de la máquina de nivel superior de aprendizaje automático, 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 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 para autocompletar servicios pueden implementar para mejorar aún más la experiencia del usuario cuando completan formularios. Para obtener más información sobre cómo 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, las cuales se resumen en las siguientes secciones:

Confirmación de protección de Android

Los dispositivos compatibles que ejecutan Android 9 o versiones posteriores te brindan lo siguiente: capacidad de usar la Confirmación de protección de Android. Cuando uses este flujo de trabajo, La app muestra un mensaje al usuario en el que se le pide que apruebe 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 guarda una firma criptográfica protegida por un código de autenticación de mensajes de hash con clave (HMAC). Una vez que Android Keystore confirme la validez del mensaje, tu app puedes usar la clave generada a partir de trustedConfirmationRequired en el repositorio de ejecución (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 suponer ningún garantías de confidencialidad más allá de las que ofrece la plataforma de Android. En especial, no uses este flujo de trabajo para mostrar información sensible que no mostrarías normalmente en el dispositivo del usuario.

Para obtener orientación sobre cómo agregar compatibilidad con la Confirmación de protección de Android, consulta el Protección de Android Confirmación .

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 funcionalidad crea una apariencia, una ubicación y una 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 confiable.

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

Módulo de seguridad de hardware

Los dispositivos compatibles que ejecutan Android 9 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 y sideloading no autorizado de apps.

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

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

Importación de claves segura al Keystore

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 almacén de claves, para que el contenido de estas 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 certificado de firma nuevo mediante la vinculación de los certificados anteriores del archivo APK con el certificado con el cual está firmado actualmente.

Obtén más información sobre cómo 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 datos almacenados o en tránsito con la clave especificada. Estos tipos de claves son adecuadas para encriptar datos sensibles y almacenarlos en el disco, como de salud o empresariales. El indicador proporciona a los usuarios una mayor seguridad de que los datos no se pueden desencriptar mientras el dispositivo está bloqueado en caso de que pierdan el teléfono o se lo roben.

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 confianza para poder acceder a él.

Compatibilidad con la 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 sensibles.

Para obtener más información sobre 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 nueva funcionalidad y opciones para desarrolladores en relación con la copia de seguridad y el restablecimiento. 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 compatibilidad se habilita automáticamente cuando se cumplen las siguientes condiciones:

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

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 da la posibilidad de definir las condiciones del dispositivo en 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 creación de copias de seguridad de datos en dispositivos Android, consulta Datos Descripción general de la Copia de seguridad.

Accesibilidad

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

Semántica de navegación

Los atributos que se agregan en Android 9 te permiten definir con mayor facilidad los servicios de accesibilidad, especialmente los lectores de pantalla, navegan desde una parte del pantalla a otra. Estos atributos pueden ayudar a los usuarios con discapacidad visual moverse rápidamente por el texto en la IU de tu app y permitirles hacer una selección.

Por ejemplo, en una aplicación de compras, un lector de pantalla puede ayudar a los usuarios a navegar directamente de una categoría de ofertas a la siguiente, sin el lector de pantalla tener 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 subpanel específico de la pantalla, como cuando una actividad reemplaza un fragmento por otro. Los paneles consisten en elementos de la interfaz de usuario relacionados visualmente y agrupados lógicamente que generalmente constan en ese fragmento.

En Android 9, puedes proporcionar títulos del panel de accesibilidad o, de forma individual, títulos identificables, para estos paneles. Si un panel tiene un título para el panel de accesibilidad, los servicios de accesibilidad reciben información más detallada cuando el panel cambia. Esta capacidad permite que los servicios proporcionen información más detallada al usuario sobre lo que cambió 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 reemplace en el tiempo de ejecución con setAccessibilityPaneTitle(). Por ejemplo, puedes proporcionar un título para el área de contenido de una Objeto Fragment.

Navegación basada en encabezados

Si tu app muestra contenido textual que incluye encabezados lógicos, establece la android:accessibilityHeading a true para las instancias de View que representan esos encabezados. De agregar estos encabezados, permites que los servicios de accesibilidad ayuden a los usuarios a navegar directamente de un encabezado a otro. Cualquier servicio de accesibilidad puede usar esta función para mejorar la experiencia de navegación del usuario en la IU.

Salida y navegación grupal

Los lectores de pantalla tradicionalmente usaban el Atributo android:focusable a determinar cuándo se debe leer un ViewGroup o una colección de objetos View, como una sola unidad. De esa manera, los usuarios podían entender 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 la 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 la 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 se enfocan en todos los elementos que hayan establecido 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 la información sobre herramientas
Las funciones agregadas al framework de accesibilidad te brindan acceso a las infografías en la IU de una app. Usa getTooltipText() para leer el texto de una información sobre herramientas y usa ACTION_SHOW_TOOLTIP y ACTION_HIDE_TOOLTIP para indicar instancias de View para mostrar o ocultar la información sobre herramientas.
Acciones globales agregadas
En Android 9, se introduce la 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 el GLOBAL_ACTION_LOCK_SCREEN y GLOBAL_ACTION_TAKE_SCREENSHOT acciones, respectivamente.

Detalles del cambio 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 un elemento TYPE_WINDOWS_CHANGED de un evento, usa el getWindowChanges() para determinar cómo cambiaron las ventanas. Durante una actualización de varias ventanas, cada ventana genera su propio conjunto de eventos. La getSource() método muestra la vista raíz de la ventana asociada con cada evento.

Si una app definió títulos del panel de accesibilidad para su View, tu servicio puede reconocer cuando se actualiza la IU de la app. Cuando un elemento TYPE_WINDOW_STATE_CHANGED cuando ocurra un evento, usa los tipos 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 despareció.

Rotación

Para eliminar las rotaciones involuntarias, agregamos un modo que fija orientación, incluso si cambia la posición del dispositivo. Los usuarios pueden activar la rotación de forma manual 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 tus La app tiene un comportamiento de rotación personalizado o usa una orientación de pantalla inusual. es posible que encuentres problemas que habrían pasado desapercibidos antes, cuando la preferencia de rotación del usuario siempre se estableció en vertical. Te sugerimos observar el comportamiento de rotación en todas las actividades principales de tu app y que te asegures de que todas las configuraciones de orientación de pantalla aún proporcionen la experiencia óptima.

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

Dispositivo móvil en modo de rotación que muestra el 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 aporta las siguientes funciones relacionadas con texto a la plataforma:

  • Texto precalculado: el La clase PrecomputedText mejora de procesamiento de texto, ya que permite calcular y almacenar en caché información anticipadamente. También permite que tu app diseñe el texto el subproceso principal.

  • Lupa: La clase Magnifier es una de plataforma que proporciona una API de lupa, lo que permite una 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 puede 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 detalles, consulta la documentación de referencia de TextView

Conversión de archivos DEX predefinida de ART

En dispositivos con Android 9 o versiones posteriores, el tiempo de ejecución de Android (ART) El compilador por adelantado optimiza aún más el ejecutable comprimido de Dalvik. (DEX) convirtiendo los archivos DEX de un paquete de apps en más compacta del mundo. 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 entrada y salida de disco más lentas.

Registro del sistema en el dispositivo

Android 9 te permite registrar registros del sistema desde tu dispositivo. luego comparte 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 tiempo relacionados con la actividad de procesamiento y subprocesos, y ver otros tipos de dispositivos de importancia global estados.

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