Características y API 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 agrega compatibilidad de plataforma para Wi-Fi IEEE 802.11-2016 de red, también conocido como tiempo de ida y vuelta de Wi-Fi (RTT), para que aproveches del posicionamiento en interiores en tus apps.

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

Con esta precisión, podrás crear nuevas experiencias, como la navegación en el edificio y detallados basados en la ubicación, como el control por voz inequívoco (por ejemplo, "Enciende esta luz") y la información basada en la ubicación (como "¿Hay ofertas especiales para este producto?").

Consulta la API de WiFi 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 corte de pantalla

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

Cómo probar el corte de pantalla con el emulador

Android 9 ofrece compatibilidad con las pantallas de borde a borde más recientes que 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 distribuya su contenido alrededor de los cortes de un dispositivo. Puedes configurar este atributo a uno de los siguientes valores:

Puedes simular un corte de pantalla en cualquier dispositivo o emulador con 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 en las notificaciones, que son disponible para desarrolladores que apunten al nivel de API 28 y versiones posteriores.

Notificaciones de mensajes

MessagingStyle con foto adjunta.

Notificación de mensajes

MessagingStyle con respuestas y conversación.

Para ver 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), puedes agregar una acción para responder mensajes o ingresar otro texto directamente desde una notificación. Mejoras de Android 9 esta función con las siguientes mejoras:

  • Compatibilidad simplificada para participantes de conversaciones: el Person clase se utiliza para identificar a las personas que participan en una conversación, incluidas 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. El siguiente fragmento de código demuestra cómo para crear una Person y un mensaje que contenga una imagen.

Kotlin

// Create new Person.
val sender = Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build()
// Create image message.
val message = Message("Picture", time, sender)
        .setData("image/", imageUri)
val style = Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message)

Java

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);
  • Guarda las respuestas como borradores: Tu app puede recuperar la EXTRA_REMOTE_INPUT_DRAFT que envía el sistema cuando un usuario cierra inadvertidamente 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 introdujo los canales de notificaciones, lo que te permite crear un un canal personalizable por el usuario 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: Ahora los usuarios pueden bloquear grupos completos de canales. en la configuración de notificaciones de una aplicación. Puedes usar la isBlocked() método 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 la configuración actual del grupo de canales con el nuevo getNotificationChannelGroup() .

  • Nuevos tipos de intents de transmisión: El sistema Android ahora envía intents de transmisión cuando cambie 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 en consecuencia. 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 a los intents de transmisión, consulta Transmisiones.

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

  • NotificationManager.Policy también tiene siete nuevas constantes de No interrumpir que puede usar para suprimir 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.

Otras mejoras en la cámara incluyen Session parámetros que ayudan a reducir las demoras durante la captura inicial, y el uso compartido Los clientes de cámaras manejan varios casos de uso sin necesidad de detenerse e iniciar 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 presenta ImageDecoder que brinda un enfoque modernizado para decodificar imágenes. Usar esta clase en lugar de BitmapFactory y BitmapFactory.Options APIs

ImageDecoder te permite crear un Drawable o una Bitmap desde 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 decodeDrawable() o decodeBitmap() pasando el archivo ImageDecoder.Source para crear un archivo Drawable o una Bitmap. Para cambiar el 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 un GIF o WebP animado, decodeDrawable() muestra un Drawable, que es una instancia de la 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 objetivo 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 de círculo. 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 el sentido de que el subproceso de renderización impulsa las animaciones de AnimatedImageDrawable. El subproceso de renderización también usa un subproceso de trabajo para decodificar, por lo que la decodificación no interferir en otras operaciones en el subproceso de renderización. Esta implementación permite tu app para mostrar una imagen animada sin administrar sus actualizaciones ni interferir con otros eventos en el subproceso de 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 modificar aún más 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 estáticas HEIF se admiten en el MediaMuxer y MediaExtractor . Con dispositivos Android 9 compatibles con la plataforma, es fácil enviar y usar imágenes HEIF de tu servidor backend. Una vez que te hayas asegurado de que tu La app es compatible con este formato de datos para compartirlos y mostrarlos. Prueba el HEIF. como formato de almacenamiento de imágenes en tu app. Puedes hacer una conversión de jpeg a heic usando 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 están disponibles en AudioTrack: AudioRecord, y MediaDrm.

Android 9 presenta métodos para el Clase MediaDRM para obtener métricas, HDCP niveles de seguridad, la cantidad de sesiones y agregar más control sobre niveles de seguridad y paradas seguras. Consulta las diferencias de API para obtener más información.

En Android 9, la API de AAudio agrega compatibilidad con varios atributos adicionales de AAudioStream, incluidos el uso, el contenido el tipo y el ajuste predeterminado de entrada. Con estos atributos, puedes crear transmisiones que se 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.

Android 9 presenta API de AudioEffect para procesamiento dinámico. Con esta clase, puedes crear efectos de audio basados en el canal, como los siguientes: ecualizador, compresión multibanda y limitador, en varias etapas. El de bandas y etapas activas es configurable, y la mayoría de los parámetros se pueden se controla en tiempo real.

JobScheduler para datos de costo confidenciales

A partir de Android 9, JobScheduler puedes usar las señales de estado de la red proporcionadas por los operadores de trabajos relacionados 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 indica que está congestionada, JobScheduler podría diferir las solicitudes de red de gran tamaño. 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 JobScheduler manejar el trabajo correctamente. Cuando se ejecuta tu trabajo, asegúrate de usar el objeto Network devuelto por 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 asistencia para 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. Tú debería pasar solo ANEURALNETWORKS_TENSOR_FLOAT32 hasta que se resuelva el problema.

Además, la API introduce una nueva función, ANeuralNetworksModel_relaxComputationFloat32toFloat16(): que te permite especificar si deseas calcular ANEURALNETWORKS_TENSOR_FLOAT32 con un rango y una precisión tan bajos como los del punto flotante IEEE 754 de 16 bits de un conjunto de datos tengan un formato común.

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 Autocompletar en tu app, consulta el 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 reafirmar que el usuario desea completar una transacciones sensibles, como realizar un pago.

Si el usuario acepta la declaración, Android Keystore recibe y almacena un firma criptográfica protegida por una autenticación de mensajes con clave hash de estado (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. El firma indica, con un alto grado de confianza, que el usuario vio el declaración y lo ha aceptado.

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 nombre de tu aplicación. Esta funcionalidad crea una apariencia y ubicación estandarizadas para el diálogo, lo que brinda a los usuarios más confianza en la autenticación un verificador de credenciales biométrico confiable.

Si tu app usa FingerprintManager Para mostrarles a los usuarios un diálogo de autenticación con huella digital, cambia al uso 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 biométrico la autenticación que un usuario eligió.

Módulo de seguridad de hardware

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

  • Su propia CPU
  • Almacenamiento seguro
  • Un generador de números aleatorios reales
  • Mecanismos adicionales de resistencia contra alteraciones de paquetes y sideloading no autorizado de apps.

Cuando se verifican las claves almacenadas en el StrongBox Keymaster, el sistema corrobora 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 almacén de claves

Android 9 brinda seguridad adicional en la desencriptación de claves agregando importar claves encriptadas de forma segura al almacén de claves mediante un con codificación ASN.1. El Keymaster luego desencripta las claves en el Keystore, para que el contenido de las claves nunca aparezca como texto simple en la memoria host del dispositivo

Más información para importar claves encriptadas de forma 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 incluir un registro de prueba de rotación en su bloque de firma para cada firma certificado. Esta función permite que se firme tu app con una firma nueva a través de la vinculación de los certificados de firma anteriores del archivo APK que ahora está firmado.

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. La marca proporciona a los usuarios una mayor seguridad de que el los datos no se pueden desencriptar mientras el dispositivo está bloqueado en caso de que pierda el teléfono o ser robadas.

Para proteger una clave de la desencriptación mientras el dispositivo está bloqueado, habilita la función experimental. si pasas true a setUnlockedDeviceRequired() . Después de completar este paso, cuando la pantalla del usuario esté bloqueada, intentos de desencriptar o firmar datos con esta clave fallan. Un dispositivo bloqueado requiere PIN, contraseña, huella dactilar o algún otro factor de confianza antes de a las que se accede.

Compatibilidad con encriptación heredada

Los dispositivos con Android 9 que incorporan Keymaster 4 admiten la función Triple Data. de encriptación, o Triple DES. Si la app funciona en conjunto con versiones que requieren Triple DES, usan este tipo de cifrado para encriptar credenciales sensibles.

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

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 funcionalidades y opciones para desarrolladores relacionadas para crear copias de seguridad y restablecerlos. Los detalles sobre estos cambios aparecen en el siguiente secciones.

Copias de seguridad de encriptación del cliente

Android 9 agrega compatibilidad para encriptar copias de seguridad de Android con un Secret del cliente. Esta compatibilidad se habilita automáticamente cuando ocurre lo siguiente: se cumplen estas condiciones:

Si se habilita esta medida de privacidad, se especificará 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 aprender para obtener más información sobre la tecnología de esta función, consulta la bóveda de clave de Google Cloud Cloud.

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 capacidad de definir el dispositivo condiciones en las que los datos de tu app se incluyen en la copia de seguridad del usuario, como cuando se crean si la encriptación está habilitada o se está realizando una transferencia local entre dispositivos.

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 mejoras en la accesibilidad que facilitan aún mejores experiencias 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 determinan cuándo se actualizó un panel específico de la pantalla, como cuando una actividad reemplaza un fragmento por otro. Los paneles consisten en elementos de la 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 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 lo que cambió en la IU.

Para especificar el título de un panel, usa la android:accessibilityPaneTitle . También puedes actualizar el título de un panel de la IU que se reemplaza en del entorno 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 la capacidad de mejorar las capacidades la experiencia de navegación de 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 hizo que algunas instancias de View se marcaran como enfocables de una manera que hizo que la navegación con el teclado fuera más engorrosa.

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. Lectores de pantalla enfócate en todos los elementos que hayan establecido android:screenReaderFocusable o android:focusable a true.

Acciones de conveniencia

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

Interacción con los cuadros de información
Las funciones agregadas al marco de accesibilidad te dan acceso a lo siguiente: información sobre la herramienta en la IU de una app. Usa getTooltipText() para leer el texto de un cuadro de información y usar el ACTION_SHOW_TOOLTIP y ACTION_HIDE_TOOLTIP para indicar a las instancias de View que muestren o ocultar la información sobre la herramienta.
Acciones globales agregadas
Android 9 incluye compatibilidad con dos acciones adicionales del dispositivo en la 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 ventana

Android 9 facilita el seguimiento de las actualizaciones en las ventanas de una app cuando esta vuelve a dibujar varias ventanas al mismo tiempo. Cuando un elemento TYPE_WINDOWS_CHANGED de un evento, usa el getWindowChanges() para determinar cómo cambiaron las ventanas. Durante una actualización multiventana, cada la ventana produce 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 ocurre un evento, usa los tipos getContentChangeTypes() para determinar cómo cambió la ventana. Por ejemplo, el framework puede detectar cuando un panel tiene un nuevo título o cuando un panel desapareció.

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 recomendamos observar el comportamiento de rotación en todas las actividades clave de tu app y asegurarte asegúrate de que todas las configuraciones de orientación de la pantalla proporcionen la experiencia óptima.

Para obtener más detalles, consulta el comportamiento asociado de la configuración.

Rotación del dispositivo móvil que muestra el nuevo modo de rotación para que los usuarios puedan activar manualmente la rotación

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

Texto

Android 9 incorpora las siguientes funciones relacionadas con texto al 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 textos seleccionados y sugerir acciones. Por ejemplo, TextClassifier puede permitir que tu app detecte de que el usuario haya seleccionado un número de teléfono. Luego, tu app podría sugerir que el para que el usuario realice una llamada telefónica con ese número. Las funciones de TextClassifier Reemplaza la funcionalidad de la clase Linkify.

  • Diseño del texto: varios métodos y atributos convenientes facilitan la implementar el diseño de la interfaz de usuario. Para obtener detalles, consulta la documentación de referencia de TextView

Conversión de archivos DEX anticipada 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, en particular, a los dispositivos de gama baja con E/S de disco más lentas de alta velocidad.

Registro del sistema en el dispositivo

Android 9 te permite capturar 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 Cómo realizar el sistema integrado en el dispositivo seguimiento.