Android 11 incluye excelentes funciones y API para desarrolladores. En las siguientes secciones, obtendrás información sobre las funciones de tus apps y cómo comenzar a usar las API relacionadas.
Para obtener una lista detallada de las API nuevas, modificadas y quitadas, consulta el informe de diferencias de API. Para obtener detalles sobre las nuevas API, consulta la referencia de la API de Android. Las nuevas API están destacadas para que sea más fácil identificarlas. Además, a fin de conocer las áreas en las que los cambios de la plataforma podrían afectar tus apps, asegúrate de revisar los cambios en el comportamiento de Android 11 para apps orientadas a Android R y para todas las apps, así como los cambios en la privacidad.
Nuevas experiencias
Controles de dispositivos
Android 11 incluye una nueva API de ControlsProviderService
que puedes usar a fin de exponer controles para dispositivos externos conectados. Estos controles aparecen en Controles de dispositivos, en el menú de encendido de Android. Para obtener más información, consulta Cómo controlar dispositivos externos.
Controles de contenido multimedia
En Android 11, se actualiza la forma en que se muestran los controles de contenido multimedia. Los controles de contenido multimedia aparecen cerca de la configuración rápida. Se organizan las sesiones de varias apps en un carrusel deslizable que incluye las transmisiones locales en el teléfono; las transmisiones remotas, como las detectadas en dispositivos externos o sesiones de transmisión; y las sesiones reanudables anteriores en el orden en que se reprodujeron por última vez.
Los usuarios pueden reiniciar las sesiones anteriores desde el carrusel sin tener que iniciar la app. Cuando comienza la reproducción, el usuario interactúa con los controles de contenido multimedia de la manera habitual.
Para obtener más información, consulta Controles de contenido multimedia.
Pantallas
Mejor compatibilidad con pantallas de cascada
Android 11 proporciona varias API para brindar compatibilidad con las pantallas de cascada, que envuelven los bordes del dispositivo. S tratan como una variante de las pantallas con cortes. Los métodos DisplayCutout
.getSafeInset…()
existentes ahora muestran la inserción segura para evitar las áreas de cascada y los cortes.
Para procesar el contenido de tu app en el área de la cascada, haz lo siguiente:
Llama al método
DisplayCutout.getWaterfallInsets()
para obtener las dimensiones exactas de la inserción de cascada.Establece el atributo de diseño de ventana
layoutInDisplayCutoutMode
enLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
para permitir que se extienda la ventana a las áreas con cortes y de cascada en todos los bordes de la pantalla. Debes asegurarte de que no haya contenido esencial en las áreas con cortes o de cascada.
Sensor de ángulo de bisagra y plegables
Android 11 permite que las apps que se ejecutan en dispositivos con configuraciones de pantalla basadas en bisagras determinen el ángulo de la bisagra proporcionando un nuevo sensor con TYPE_HINGE_ANGLE
y una nueva SensorEvent
que puede supervisar el ángulo de la bisagra y proporcionar una medición en grados entre dos partes integrales del dispositivo. Puedes usar esas mediciones sin procesar para realizar animaciones detalladas mientras el usuario manipula el dispositivo.
Consulta Dispositivos plegables.
Conversaciones
Mejoras en las conversaciones
Android 11 incorpora una serie de mejoras en la forma en que se manejan las conversaciones. Las conversaciones son bidireccionales y en tiempo real entre dos o más personas. Esas conversaciones tienen especial importancia y los usuarios disponen de varias opciones nuevas para interactuar con ellas.
Para obtener más información sobre las conversaciones y la manera en que tu app puede admitirlas, consulta Personas y conversaciones.
Burbujas de chat
Las burbujas ahora están disponibles para que los desarrolladores ayuden a mostrar conversaciones en todo el sistema. Burbujas fue una función experimental de Android 10 que se habilitaba mediante una opción para desarrolladores. En Android 11, esto ya no es necesario.
Si una app se orienta a Android 11 (nivel de API 30) o versiones posteriores, las notificaciones no se mostrarán como burbujas a menos que cumplan con los requisitos de conversación nuevos. Específicamente, la notificación debe estar asociada a un acceso directo.
Antes de Android 11, si se quería enviar una notificación, era necesario especificar explícitamente que la notificación se configuraba siempre en el modo de IU del documento. A partir de Android 11, ya no se necesita establecer esa configuración de forma explícita. Si la notificación aparece en una burbuja, la plataforma configura automáticamente la notificación para que siempre se inicie en el modo de IU del documento.
Hay varias mejoras en el rendimiento de las burbujas, y los usuarios tienen más flexibilidad a la hora de habilitar e inhabilitar las burbujas de cada app. Para los desarrolladores que implementaron la compatibilidad con la versión experimental, hay algunos cambios en las API de Android 11:
- El constructor
BubbleMetadata.Builder()
sin parámetros dejó de estar disponible. En su lugar, usa cualquiera de los dos constructores nuevos:BubbleMetadata.Builder(PendingIntent, Icon)
oBubbleMetadata.Builder(String)
. - Crea
BubbleMetadata
desde un ID de acceso directo llamando aBubbleMetadata.Builder(String)
. La string que se pase debería coincidir con el ID de acceso directo proporcionado aNotification.Builder
. - Crea íconos de burbuja con
Icon.createWithContentUri()
o con el nuevo métodocreateWithAdaptiveBitmapContentUri()
.
Indicadores visuales de 5G
A fin de obtener información para mostrar indicadores de 5G en los dispositivos de los usuarios, consulta Cómo indicar a los usuarios cuándo están usando la red 5G.
Privacidad
Android 11 introduce una gran cantidad de cambios y restricciones para mejorar la privacidad del usuario. Para obtener más información, visita la página Privacidad.
Seguridad
Cómo realizar actualizaciones de autenticación biométrica
Para ayudarte a controlar el nivel de seguridad de los datos de tu app, Android 11 ofrece varias mejoras en la autenticación biométrica. Estos cambios también aparecen en la biblioteca biométrica de Jetpack.
Tipos de autenticación
Android 11 incluye la interfaz BiometricManager.Authenticators
, que puedes usar para declarar los tipos de autenticación que admite tu app.
Cómo determinar qué tipo de autenticación se usó
Después de que el usuario se autentique, podrás verificar si lo hizo usando una credencial de dispositivo o una credencial biométrica llamando al método getAuthenticationType()
.
Compatibilidad adicional con las claves de autenticación según el uso
Android 11 proporciona una mayor compatibilidad con la autenticación mediante claves de autenticación según el uso.
Métodos obsoletos
En Android 11, los siguientes métodos dejan de estar disponibles:
- El método
setDeviceCredentialAllowed()
. - El método
setUserAuthenticationValidityDurationSeconds()
. - La versión sobrecargada de
canAuthenticate()
que no toma argumentos.
Uso compartido seguro de grandes conjuntos de datos
En algunas situaciones, como las relacionadas con el aprendizaje automático o la reproducción de contenido multimedia, es posible que tu app requiera usar el mismo conjunto de datos de gran tamaño que otra app. En versiones anteriores de Android, tu app y la otra tenían que descargar una copia separada del mismo conjunto de datos.
Para ayudar a mitigar la redundancia de datos, tanto en la red como en el disco, Android 11 permite que se almacenen estos grandes conjuntos de datos en la caché del dispositivo mediante blobs de datos compartidos. Si deseas obtener más información sobre cómo compartir conjuntos de datos, consulta la guía detallada sobre cómo compartir conjuntos de datos de gran tamaño.
Cómo realizar encriptación basada en archivos después de un reinicio inalámbrico sin credenciales de usuario
Después de que el dispositivo completa una actualización inalámbrica y se reinicia, las claves encriptadas por credencial (CE) que se encuentran en el almacenamiento protegido mediante credenciales están disponibles de inmediato para las operaciones de encriptación basada en archivos (FBE). Esto significa que, después de una actualización inalámbrica, tu app puede reanudar las operaciones que requieren las claves CE antes de que el usuario ingrese su PIN, patrón o contraseña.
Rendimiento y calidad
Depuración inalámbrica
Android 11 admite la implementación y la depuración de tu app de forma inalámbrica desde tu estación de trabajo a través de Android Debug Bridge (adb). Por ejemplo, puedes implementar tu app depurable en varios dispositivos remotos sin conectar físicamente tu dispositivo a través de USB y lidiar con problemas comunes de conexión USB, como la instalación de controladores. Para obtener más información, consulta Cómo ejecutar apps en un dispositivo de hardware.
Instalación del APK de ADB incremental
La instalación de APK grande (más de 2 GB) en un dispositivo puede llevar mucho tiempo, incluso si solo se realiza un pequeño cambio en una app. La instalación incremental del APK de ADB (Android Debug Bridge) acelera este proceso mediante la instalación de suficientes APK para iniciar la app mientras se transmiten los datos restantes en segundo plano. adb install
usará automáticamente esta función si es compatible con el dispositivo y si tienes instaladas la versión más reciente de las Herramientas de la plataforma del SDK. Si no es compatible, se usará de forma silenciosa el método de instalación predeterminado.
Usa el siguiente comando adb para utilizar la función. Si el dispositivo no admite la instalación incremental, el comando falla y muestra una explicación detallada.
adb install --incremental
Antes de ejecutar una instalación del APK de ADB incremental, debes firmar tu APK y crear un archivo de esquema de firma de APK v4. Se debe colocar el archivo de firma v4 junto al APK para poder usar esta función.
Cómo detectar errores con el asignador de memoria nativa
GWP-ASan es una función de asignación de memoria nativa que ayuda a encontrar errores ampliados de búfer libre y del montón. Puedes habilitar esta función de forma global o para subprocesos específicos de tu app. Si quieres obtener más información, consulta la guía de GWP-Asan.
API de Neural Networks 1.3
Android 11 expande y mejora la API de Neural Networks (NNAPI).
Nuevas operaciones
NNAPI 1.3 introduce un nuevo tipo de operando, TENSOR_QUANT8_ASYMM_SIGNED
, con el objetivo de admitir el nuevo esquema de cuantificación de TensorFlow Lite.
Además, NNAPI 1.3 introduce las siguientes operaciones nuevas:
QUANTIZED_LSTM
IF
WHILE
ELU
HARD_SWISH
FILL
RANK
Nuevos controles de AA
NNAPI 1.3 presenta nuevos controles para que el aprendizaje automático funcione sin problemas:
API de QoS: La nueva API de Calidad de servicio admite la priorización y los plazos de las tareas en NNAPI con las siguientes funciones nuevas:
Entrada/salida del dominio de memoria: NNAPI 1.3 incluye compatibilidad con los dominios de memoria como entrada y salida para la ejecución. Así, se quitan las copias innecesarias de los mismos datos entre los diferentes componentes del sistema, lo que mejora el rendimiento del tiempo de ejecución de las redes neuronales de Android. Esta función agrega un conjunto de nuevas API de NDK para usar con objetos
ANeuralNetworksMemoryDesc
yANeuralNetworkMemory
, entre las que se incluyen las siguientes funciones:ANeuralNetworksMemoryDesc_create()
ANeuralNetworksMemoryDesc_free()
ANeuralNetworksMemoryDesc_addInputRole()
ANeuralNetworksMemoryDesc_addOutputRole()
ANeuralNetworksMemoryDesc_setDimensions()
ANeuralNetworksMemoryDesc_finish()
ANeuralNetworksMemory_createFromDesc()
ANeuralNetworksMemory_copy()
Para obtener más información, consulta la muestra del dominio de memoria de redes neuronales.
Compatibilidad con API de dependencia y vallas de sincronización: NNAPI 1.3 incluye compatibilidad con procesamiento asíncrono con dependencias, lo que permite reducir considerablemente la sobrecarga cuando se invocan modelos con cadenas pequeños. Se agregan las siguientes funciones nuevas:
Control de flujo: NNAPI 1.3 incluye compatibilidad con el flujo de control general con las nuevas operaciones de gráficos
ANEURALNETWORKS_IF
yANEURALNETWORKS_WHILE
, que aceptan otros modelos como argumentos con el nuevo tipo de operandoANEURALNETWORKS_MODEL
. Además, se incluyen las siguientes funciones nuevas:
API térmica del NDK
Cuando los dispositivos se calientan demasiado, es posible que aceleren la CPU o la GPU, y esto puede afectar las apps de maneras inesperadas. Las apps o los juegos que incorporan gráficos complejos, procesamiento intensivo o actividad de red sostenida tienen más probabilidades de encontrar problemas.
Usa la API térmica de NDK en Android 11 para supervisar los cambios de temperatura en el dispositivo y tomar medidas para mantener un consumo de energía y la temperatura del dispositivo más bajos. Esta API es similar a la API termal de Java; puedes usarla para recibir notificaciones de cualquier cambio de estado o consultar el estado actual directamente.
Texto y entrada
Transiciones del IME mejoradas
Android 11 presenta nuevas API para mejorar las transiciones de los editores de métodos de entrada (IME), como los teclados en pantalla. Estas API facilitan el ajuste del contenido de tu app en sincronización con la aparición y desaparición del IME y con otros elementos, como las barras de estado y de navegación.
Para mostrar un IME mientras cualquier EditText
está enfocada, llama a view.getInsetsController().show(Type.ime())
.
(Puedes llamar a este método en cualquier vista con la misma jerarquía que EditText
centrado, no tienes que llamarlo específicamente en EditText
). Para ocultar el IME, llama a view.getInsetsController().hide(Type.ime())
.
Para comprobar si un IME es visible actualmente, llama a view.getRootWindowInsets().isVisible(Type.ime())
.
Para sincronizar las vistas de tu app con la apariencia y desaparición del IME, establece un objeto de escucha en una vista mediante WindowInsetsAnimation.Callback
en View.setWindowInsetsAnimationCallback()
.
(Puedes configurar este objeto de escucha en cualquier vista; no es necesario que sea EditText
). El IME llama al método onPrepare()
del objeto de escucha; luego, llama a onStart()
al comienzo de la transición. Luego, llama a onProgress()
en cada progreso de la transición. Cuando finaliza la transición, el IME llama a onEnd()
.
En cualquier momento de la transición, puedes llamar a WindowInsetsAnimation.getFraction()
para saber cuánto progreso ha realizado.
Para ver un ejemplo de cómo usar estas API, consulta la nueva muestra de código de WindowInsetsAnimation.
Cómo controlar la animación del IME
También puedes tomar el control de la animación IME o de la animación de otra barra del sistema, como la de navegación. Para ello, primero llama a setOnApplyWindowInsetsListener()
y establece un nuevo objeto de escucha para los cambios de inserción de ventana:
Kotlin
rootView.setOnApplyWindowInsetsListener { rootView, windowInsets -> val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime()) rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom) // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. WindowInsets.CONSUMED }
Java
mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime()); mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom); // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. return WindowInsets.CONSUMED; } });
Para mover el IME u otra barra del sistema, invoca el método controlWindowInsetsAnimation()
del controlador:
Kotlin
view.windowInsetsController.controlWindowInsetsAnimation( Type.ime(), 1000, LinearInterpolator(), cancellationSignal, object : WindowInsetsAnimationControlListener() { fun onReady(controller: WindowInsetsAnimationController, types: Int) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */) } } );
Java
mRoot.getWindowInsetsController().controlWindowInsetsAnimation( Type.ime(), 1000, new LinearInterpolator(), cancellationSignal, new WindowInsetsAnimationControlListener() { @Override public void onReady( @NonNull WindowInsetsAnimationController controller, int types ) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */); } @Override public void onCancelled() {} });
Actualización de las bibliotecas de ICU
En Android 11, se actualizó el paquete de android.icu
para usar la versión 66 de la biblioteca de ICU, mientras que en Android 10 se usaba la versión 63. La nueva versión de la biblioteca incluye datos actualizados de la configuración regional de CLDR y una serie de mejoras en la compatibilidad con la internacionalización en Android.
Entre los cambios más importantes de las nuevas versiones de la biblioteca, se incluyen los siguientes:
- Muchas API de formato ahora admiten un nuevo tipo de objeto de resultado que extiende
FormattedValue
. - Se mejoró la API de
LocaleMatcher
con una clase de constructor, compatibilidad con el tipojava.util.Locale
y una clase de resultado que incluye datos adicionales sobre una coincidencia. - Ahora se admite Unicode 13.
Contenido multimedia
Cómo asignar búferes de MediaCodec
Android 11 incluye una nueva API de MediaCodec
que brinda más control a las apps cuando se asignan los búferes de entrada y salida. Esto permite que tu app administre la memoria de manera más eficiente.
Nuevas clases:
Nuevos métodos:
MediaCodec.getQueueRequest()
MediaCodec.getOutputFrame()
MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
Además, cambió el comportamiento de dos métodos en MediaCodec.Callback()
:
onInputBufferAvailable()
- En lugar de llamar a
MediaCodec.getInputBuffer()
yMediaCodec.queueInputBuffer()
con el índice, si se configura para usar la API de Block Model, las apps deben usarMediaCodec.getQueueRequest
con el índice y adjuntar un LinearBlock/HardwareBuffer a la ranura. onOutputBufferAvailable()
- En lugar de llamar a
MediaCodec.getOutputBuffer()
con el índice, las app pueden usarMediaCodec.getOutputFrame()
con el índice para obtener el objetoOutputFrame
con más información y los búferes LinearBlock/HardwareBuffer.
Decodificación de latencia baja en MediaCodec
Android 11 mejora la clase MediaCodec
con el objetivo de admitir la decodificación de latencia baja para juegos y otras apps que se ejecutan en tiempo real. Puedes comprobar si un códec admite la decodificación de latencia baja pasando FEATURE_LowLatency
a MediaCodecInfo.CodecCapabilities.isFeatureSupported()
.
Si deseas activar o desactivar la decodificación de latencia baja, realiza una de las siguientes acciones:
- Establece la nueva clave de
KEY_LOW_LATENCY
en 0 o 1 conMediaCodec.configure()
. - Establece la nueva clave de parámetro
PARAMETER_KEY_LOW_LATENCY
en 0 o 1 conMediaCodec.setParameters()
.
Nueva función de AAudio: AAudioStream_release()
La función AAudioStream_close()
actualiza y cierra una transmisión de audio al mismo tiempo. Esto puede ser peligroso. Si otro proceso intenta acceder a la transmisión después de que se cierra, el proceso fallará.
La nueva función AAudioStream_release()
actualiza la transmisión, pero no la cierra. Así, se liberan sus recursos y se deja la transmisión en un estado conocido. El objeto persiste hasta que llamas a la función AAudioStream_close()
.
API de MediaParser
MediaParser es una nueva API de bajo nivel para la extracción de contenido multimedia. Es más flexible que MediaExtractor y proporciona control adicional sobre la función de extracción de contenido multimedia.
Captura de audio desde un dispositivo USB
Cuando una aplicación sin el permiso RECORD_AUDIO
usa UsbManager
a fin de solicitar acceso directo a un dispositivo de audio USB con capacidad de captura de audio (como los auriculares USB), aparece un nuevo mensaje de advertencia en el que se solicita al usuario que confirme el permiso para usar el dispositivo. El sistema ignora cualquier opción del tipo "usar siempre", de modo que el usuario deberá confirmar la recepción de la advertencia y otorgar el permiso cada vez que una app solicite acceso.
Para evitar este comportamiento, tu app debe solicitar el permiso RECORD_AUDIO
.
Acceso de micrófono simultáneo
En Android 11, se agregaron métodos nuevos a las API AudioRecord
, MediaRecorder
y AAudioStream
. Estos métodos habilitan e inhabilitan la capacidad de captura simultánea, independientemente del caso de uso seleccionado. Consulta Cómo compartir entradas de audio.
Selector de salida
En Android 11, se implementa un nuevo comportamiento para las apps que usan las API de Cast y Mediarouter.
Además de acceder a las opciones de transmisión desde una app, las opciones de cambio también aparecen en el reproductor de contenido multimedia del sistema. Esto ayuda al usuario a pasar sin problemas de un dispositivo a otro a medida que cambia su contexto de visualización y reproducción, como cuando mira videos en la cocina o en el teléfono, o cuando escucha audio en el hogar o en el automóvil. Consulta el selector de salida.
Conectividad
Mejoras en Wi-Fi Passpoint
Para obtener información sobre las funciones de Passpoint agregadas en Android 11, consulta Passpoint.
Se expandió la API de sugerencias de Wi-Fi
En Android 11, se expandió la API de sugerencias de Wi-Fi para aumentar las capacidades de administración de red de tu app, incluidas las siguientes:
- Las apps de administración de conectividad pueden administrar sus propias redes permitiendo solicitudes de desconexión.
- Las redes de Passpoint están integradas en la API de sugerencias y se pueden sugerir al usuario.
- Las API de Analytics te permiten obtener información sobre la calidad de tus redes.
Actualizaciones de CallScreeningService
A partir de Android 11, una clase CallScreeningService puede solicitar información sobre el estado de verificación STIR/SHAKEN (verstat) de las llamadas entrantes. Se proporciona esta información como parte de los detalles de la llamada de las llamadas entrantes.
Si un CallScreeningService
tiene el permiso READ_CONTACTS
, la app recibe una notificación cuando hay llamadas entrantes o llamadas salientes a un número en los contactos del usuario.
Para obtener más información, consulta Cómo evitar la falsificación de identificadores de llamadas.
Actualizaciones de la API de Open Mobile
Para obtener información sobre la compatibilidad con OMAPI en Android 11 y versiones posteriores, consulta Compatibilidad con lectores de la API de Open Mobile.
VPN de gran rendimiento
Las apps que se orientan a la API nivel 30 o superior, o que se ejecutan en dispositivos lanzados en la API nivel 29 pueden aplicar IKEv2/IPsec a las VPN basadas en apps y configuradas por el usuario.
Las VPN se ejecutan de forma nativa en el sistema operativo, lo que simplifica el código necesario para establecer conexiones VPN de tipo IKEv2/IPsec en las apps.
Control de acceso a la red por proceso
A fin de obtener información para habilitar el acceso a la red por proceso, consulta Cómo administrar el uso de la red.
Cómo permitir varias configuraciones de Passpoint instaladas con el mismo FQDN
A partir de Android 11, puedes usar PasspointConfiguration.getUniqueId()
a fin de obtener un identificador único para un objeto PasspointConfiguration
, lo que permite a los usuarios instalar varios perfiles con el mismo nombre de dominio completamente calificado (FQDN).
Esta función es útil cuando un proveedor implementa más de una combinación de código móvil de país (MCC) y código de red móvil (MNC) en su red, pero tiene un solo FQDN. En Android 11 y versiones posteriores, se puede instalar más de un perfil con el mismo FQDN que coincida con la red como proveedor principal cuando el usuario instale una tarjeta SIM con MCC o MNC.
Compatibilidad con antenas GNSS
Android 11 introduce la clase GnssAntennaInfo
, que permite a tu app aprovechar mejor el posicionamiento de precisión centimétrica que puede proporcionar el sistema global de navegación por satélite (GNSS).
Consulta la guía con información sobre calibración de la antena.
Gráficos
Decodificador de imágenes NDK
La API ImageDecoder
del NDK proporciona una API estándar para que las apps C/C++ de Android decodifiquen imágenes de forma directa. Los desarrolladores de aplicaciones ya no necesitan usar las API de framework (a través de JNI) ni empaquetar bibliotecas de decodificación de imágenes de terceros. Para obtener más información, consulta la Guía para desarrolladores sobre el decodificador de imágenes.
API de velocidad de fotogramas
Android 11 proporciona una API que permite que las apps informen al sistema acerca de la velocidad de fotogramas deseada para reducir la vibración en dispositivos compatibles con varias frecuencias de actualización. Para obtener información sobre cómo usar esta API, consulta la Guía de frecuencia de fotogramas.
Solicitud y comprobación de compatibilidad con la latencia baja
Algunas pantallas pueden realizar el posprocesamiento de gráficos, como ciertas pantallas y TVs externas. Este posprocesamiento mejora los gráficos, pero puede aumentar la latencia. Las pantallas más recientes compatibles con HDMI 2.1 tienen un modo de latencia baja automática (ALLM, también conocido como modo de juego), que desactiva el posprocesamiento a fin de minimizar la latencia. Para obtener más información sobre el ALLM, consulta la especificación HDMI 2.1.
Una ventana puede solicitar que se use el modo de latencia baja automática si está disponible. El ALLM es particularmente útil para apps como videoconferencias y juegos, donde la baja latencia es más importante que obtener los mejores gráficos posibles.
Para activar o desactivar el posprocesamiento mínimo, llama al método Window.setPreferMinimalPostProcessing()
o establece el atributo preferMinimalPostProcessing
de la ventana como true
. No todas las pantallas admiten un posprocesamiento mínimo. Para averiguar si una pantalla específica lo admite, llama al nuevo método Display.isMinimalPostProcessingSupported()
.
Inyección de la capa de depuración de gráficos de rendimiento
Ahora las apps pueden cargar capas de gráficos externos (GLES, Vulkan) en código de aplicaciones nativas para exponer la misma funcionalidad que una app depurable, pero sin incurrir en la sobrecarga de rendimiento. Esta función es especialmente importante cuando creas el perfil de tu aplicación con herramientas como GAPID. Para crear un perfil de tu app, incluye el siguiente elemento de metadatos en el archivo del manifiesto de tu aplicación, en lugar de hacer que esta sea depurable:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
Imágenes y cámara
Silencia los sonidos y las vibraciones de las notificaciones durante la captura activa
A partir de Android 11, cuando usas activamente la cámara, tu app puede silenciar solo las vibraciones, los sonidos y las vibraciones, o bien no usar setCameraAudioRestriction()
.
Compatibilidad ampliada con la cámara en Android Emulator
Para obtener información sobre la compatibilidad expandida de las cámaras en el emulador a partir de Android 11, consulta Compatibilidad con la cámara.
Compatibilidad con el uso simultáneo de más de una cámara
En Android 11, se agregaron API para admitir consultas sobre el uso de más de una cámara a la vez, incluidas las cámaras frontal y posterior.
Usa los siguientes métodos para comprobar la compatibilidad con el dispositivo en el que se ejecuta tu app:
getConcurrentCameraIds()
muestra unSet
de combinaciones de ID de cámara que pueden transmitirse de forma simultánea con combinaciones de transmisión garantizadas cuando las configura el mismo proceso de aplicación.isConcurrentSessionConfigurationSupported()
consulta si los dispositivos de cámara pueden admitir de forma simultánea las configuraciones de sesión correspondientes.
Mejor compatibilidad con imágenes HEIF con varios fotogramas
A partir de Android 11, si llamas a ImageDecoder.decodeDrawable()
y pasas una imagen HEIF que contiene una secuencia de fotogramas (como una animación o una foto de ráfaga), el método muestra un AnimatedImageDrawable
que contiene toda la secuencia de la imagen. En versiones anteriores de Android, el método mostraba un objeto BitmapDrawable
de solo un fotograma.
Si el gráfico HEIF contiene varios fotogramas que no están en una secuencia, puedes recuperar un fotograma individual llamando al método MediaMetadataRetriever.getImageAtIndex()
.
Accesibilidad
Actualizaciones para desarrolladores de servicios de accesibilidad
Si creas un servicio de accesibilidad personalizado, puedes usar las siguientes funciones en Android 11:
- La explicación de un servicio de accesibilidad orientado al usuario ahora admite HTML e imágenes, además de texto sin formato. Esta flexibilidad facilita la tarea de explicarles a los usuarios finales qué objetivo tiene tu servicio y cómo puede ayudarlos.
- Para trabajar con una descripción del estado de un elemento de la IU que sea más significativo semánticamente que
contentDescription
, invoca el métodogetStateDescription()
. - Para solicitar que los eventos táctiles omitan el explorador táctil del sistema, llama al método
setTouchExplorationPassthroughRegion()
. Asimismo, para solicitar que los gestos eludan el detector de gestos del sistema, llama asetGestureDetectionPassthroughRegion()
. - Puedes solicitar acciones del IME, como "enter" y "next", además de capturas de pantalla de ventanas que no tienen habilitada la marca
FLAG_SECURE
.
Funciones adicionales
Motivos de salida del proceso de la app
Android 11 presenta el método ActivityManager.getHistoricalProcessExitReasons()
, que informa los motivos de las cancelaciones de procesos recientes. Las apps pueden usarlo para recopilar información sobre el diagnóstico de fallas, por ejemplo, si la cancelación de un proceso se debe a ANR, problemas de memoria u otros motivos.
Además, puedes usar el nuevo método setProcessStateSummary()
a fin de almacenar información de estado personalizada para su posterior análisis.
El método getHistoricalProcessExitReasons()
muestra instancias de la clase ApplicationExitInfo
, que contiene información relacionada con la finalización del proceso de una app. Si llamas a getReason()
en una instancia de esta clase, puedes determinar por qué se canceló el proceso de tu app. Por ejemplo, un valor de retorno de REASON_CRASH
indica que se produjo una excepción no administrada en tu app. Si tu app necesita garantizar la exclusividad para los eventos de salida, puede mantener un identificador específico de la app, como un valor de hash basado en la marca de tiempo del método getTimestamp()
.
Recursos adicionales
Para obtener más información, lee el artículo sobre las nuevas herramientas de Android 11 para que las apps sean más privadas y estables en Medium.
Cargadores de recursos
Android 11 presenta una nueva API que permite a las apps ampliar de forma dinámica la manera en que se buscan y se cargan los recursos. Las nuevas clases de API de ResourcesLoader
y ResourcesProvider
son las principales responsables de proporcionar la nueva funcionalidad. En conjunto, ofrecen la capacidad de proporcionar recursos y activos adicionales, o de modificar los valores de recursos y activos existentes.
Los objetos ResourcesLoader
son contenedores que proporcionan objetos ResourcesProvider
a la instancia de Resources
de una app. A su vez, los objetos ResourcesProvider
proporcionan métodos para cargar datos de recursos de APK y tablas de recursos.
Un caso práctico principal para esta API es la carga de elementos personalizados. Puedes usar loadFromDirectory()
para crear un ResourcesProvider
que redireccione la resolución de recursos y activos basados en archivos, lo que hace que busque un directorio específico, en lugar del APK de la aplicación. Puedes acceder a los activos a través de la familia de métodos open()
de la clase de API AssetManager
, al igual que con los activos empaquetados en el APK.
Esquema de firma de APK v4
En Android 11 se incluye compatibilidad con el esquema de firma de APK v4. Este esquema produce un nuevo tipo de firma en un archivo separado (apk-name.apk.idsig
), pero es similar a v2 y v3. No se realizaron cambios en el APK. Este esquema es compatible con la instalación de APK de ADB incremental, lo que acelera la instalación de APK.
Filtros de intents dinámicos
Para recibir intents, una app debe declarar durante el tiempo de compilación qué tipos de datos puede recibir definiendo un filtro de intents en el manifiesto de la app. En Android 10 y versiones anteriores, las apps no tienen forma de cambiar sus filtros de intents durante el tiempo de ejecución. Es un problema para las apps de virtualización (como las máquinas virtuales y las computadoras de escritorio remoto), ya que no tienen forma de saber exactamente qué software instalará el usuario en ellas.
Android 11 presenta grupos de MIME, un elemento nuevo de manifiesto que permite a una app declarar un conjunto dinámico de tipos de MIME en un filtro de intents y modificarlo de manera programática durante el tiempo de ejecución. Para usar un grupo de MIME, incluye un elemento de datos en el manifiesto de tu app con el atributo android:mimeGroup
nuevo:
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeGroup="myMimeGroup"/> </intent-filter>
El valor del atributo android:mimeGroup
es un ID de string arbitrario que identifica el grupo de MIME durante el tiempo de ejecución. Para acceder a un grupo de MIME y actualizar el contenido, pasa su ID a los siguientes métodos nuevos en la clase de API PackageManager
:
Cuando se agrega un tipo de MIME a un grupo de MIME de manera programática, funciona exactamente igual que un tipo de MIME estático declarado de manera explícita en el manifiesto.
Mejoras de Autocompletar
Android 11 presenta mejoras para los servicios de autocompletado.
Identificadores de sugerencia en AssistStructure.ViewNode
Los servicios de autocompletado suelen ser útiles para procesar un hash de firma para una vista basada en las propiedades de la vista. La sugerencia de vista es una propiedad que se recomienda incluir cuando se calcula un hash de firma, pero la string de sugerencia puede cambiar con la configuración regional del teléfono. Para resolver este problema, Android 11 expande AssistStructure.ViewNode
con un nuevo método getHintIdEntry()
, que muestra el identificador de recursos para el texto de sugerencia de una vista. Este método proporciona un valor independiente de la configuración regional que puedes usar para calcular hashes de firma.
Eventos mostrados en conjuntos de datos
Para ayudar a los servicios de autocompletado a mejorar sus sugerencias, Android 11 proporciona una forma de identificar casos en los que un servicio de autocompletado presentó conjuntos de datos, pero el usuario no seleccionó ninguno de ellos. En Android 11, FillEventHistory
informa sobre un nuevo tipo de evento TYPE_DATASETS_SHOWN
. FillEventHistory
registra un evento de este tipo cada vez que el servicio de autocompletado presenta uno o más conjuntos de datos al usuario. Los servicios de autocompletado pueden usar estos eventos junto con el evento TYPE_DATASET_SELECTED
existente para determinar si el usuario seleccionó alguna de las opciones de autocompletado.
Integración con el IME
Los teclados y otros IME ahora pueden mostrar sugerencias de autocompletado intercaladas, en una tira de sugerencias o una interfaz similar, en lugar de hacerlo en un menú desplegable. Para proteger la información sensible, como contraseñas y números de tarjetas de crédito, las sugerencias se muestran al usuario, pero el IME no las conoce hasta que el usuario selecciona una. Para obtener información sobre cómo los IME y los administradores de contraseñas pueden admitir esta función, consulta Cómo integrar el autocompletado con teclados.
Cómo compartir datos con el servicio de captura de contenido
A partir de Android 11, tu app puede compartir datos con el servicio de captura de contenido del dispositivo. Esta función facilita que un dispositivo entregue inteligencia contextual, como mostrar el nombre de una canción que se reproduce en el entorno del usuario.
A fin de que los datos de tu app estén disponibles para el servicio de captura de contenido, llama al método shareData()
en una instancia de ContentCaptureManager
. Si el sistema acepta la solicitud de uso compartido de datos, tu app recibirá un descriptor de archivo de solo escritura para compartir con el servicio de captura de contenido.