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
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
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:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
Puedes simular un corte de pantalla en cualquier dispositivo o emulador con Android 9. de la siguiente manera:
- Habilita las opciones para desarrolladores.
- En la pantalla Opciones para desarrolladores, desplázate hacia abajo hasta la sección Dibujo. y selecciona Simular una pantalla con un corte.
- 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.
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, comoaddMessage()
: Ahora aprovecha la clasePerson
en lugar de unCharSequence
. La clasePerson
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 unaPerson
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:PRIORITY_CATEGORY_ALARMS
prioriza alarmas.PRIORITY_CATEGORY_MEDIA
prioriza los sonidos de las fuentes multimedia, como la navegación multimedia y por voz.PRIORITY_CATEGORY_SYSTEM
y prioriza los sonidos del sistema.
NotificationManager.Policy
también tiene siete nuevas constantes de No interrumpir que puede usar para suprimir la interrupción visual:SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
impide que la notificación inicie actividad en pantalla completa.SUPPRESSED_EFFECT_LIGHTS
bloquea las luces de notificación.SUPPRESSED_EFFECT_PEEK
evita que las notificaciones aparezcan brevemente en la vista ("visualización").SUPPRESSED_EFFECT_STATUS_BAR
Evita que las notificaciones aparezcan en la barra de estado en dispositivos que admiten barras de estado.SUPPRESSED_EFFECT_BADGE
bloquea insignias en dispositivos que admiten insignias. Para obtener más información, consulta Cómo modificar un distintivo de notificaciónSUPPRESSED_EFFECT_AMBIENT
bloquea las notificaciones en los dispositivos que admiten pantallas ambiente.SUPPRESSED_EFFECT_NOTIFICATION_LIST
Impide que las notificaciones aparezcan en la vista de lista en dispositivos compatibles con esta vista, como el panel de notificaciones o la pantalla de bloqueo.
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 asetTargetSampleSize()
- 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
asetMutableRequired()
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:
- Operaciones matemáticas en elementos:
- Operaciones de arrays:
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:
- El usuario habilita copia de seguridad con Android 9 o una superior.
- El usuario ha configurado una pantalla de seguridad en su dispositivo que requiere un PIN, un patrón o una contraseña para desbloquearse.
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 elACTION_SHOW_TOOLTIP
yACTION_HIDE_TOOLTIP
para indicar a las instancias deView
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
clase. Tu servicio puede ayudar a los usuarios a bloquear sus dispositivos y tomar capturas de pantalla con elGLOBAL_ACTION_LOCK_SCREEN
yGLOBAL_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 ocurra 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.
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 deTextClassifier
Reemplaza la funcionalidad de la claseLinkify
.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.