Nivel de API: 21
Android 5.0 (LOLLIPOP) ofrece nuevas funciones para los usuarios y los desarrolladores de apps. En este documento, se ofrece una introducción a las APIs nuevas más destacadas.
Si tienes una app publicada, asegúrate de consultar los Cambios de comportamiento en Android 5.0 que debes tener en cuenta en tu app. Estos cambios de comportamiento pueden afectar tu app en dispositivos con Android 5.0, incluso si no usas APIs nuevas o te orientas a nuevas funcionalidades.
Para obtener una visión de alto nivel de las nuevas funciones de la plataforma, consulta las Funciones destacadas de Android Lollipop.
Iniciar el desarrollo
Para comenzar a compilar apps para Android 5.0, primero debes obtener el SDK de Android. Luego, utiliza SDK Manager para descargar las imágenes del sistema y la plataforma de SDK de Android 5.0.
Actualiza el nivel de tu API de destino
A fin de optimizar mejor tu app para dispositivos que ejecutan Android 5.0, establece targetSdkVersion
en "21"
, instala la app en una imagen del sistema de Android 5.0, pruébala y, luego, publica la app actualizada con este cambio.
Puedes usar las APIs de Android 5.0 y, al mismo tiempo, admitir versiones anteriores si agregas condiciones a tu código que verifiquen el nivel de API del sistema antes de ejecutar las APIs no compatibles con minSdkVersion
.
Si deseas obtener más información sobre cómo mantener la retrocompatibilidad, consulta Cómo brindar compatibilidad con diferentes versiones de la plataforma.
Para obtener más información sobre cómo funcionan los niveles de API, consulta ¿Qué es el nivel de API?
Importantes cambios en los comportamientos
Si publicaste anteriormente una app para Android, ten en cuenta que esta podría verse afectada por los cambios de Android 5.0.
Consulta Cambios en Android 5.0 para obtener información completa.
Interfaz de usuario
Compatibilidad con Material Design
Android 5.0 agrega compatibilidad para el nuevo estilo de Material Design de Android. Puedes crear apps con Material Design que sean visualmente dinámicas y que tengan transiciones de elementos de la IU que se sientan naturales para los usuarios. Esta compatibilidad incluye lo siguiente:
- Tema material
- Visualización de sombras
- El widget de
RecyclerView
- Animación de elementos de diseño y efectos de estilo
- Animación de material design y efectos de transición de actividad
- Animadores para propiedades de vista en función del estado de la vista
- Widgets personalizables de IU y barras de apps con paletas de colores que puedes controlar
- Elementos de diseño animados y no animados en función de gráficos vectoriales XML
Para obtener más información sobre cómo agregar la funcionalidad de Material Design a tu app, consulta Material Design.
Documentos y actividades concurrentes en la pantalla de recientes
En las versiones anteriores, la
pantalla de recientes
solo podía mostrar una tarea para cada app con la que el usuario había interactuado
más recientemente. Ahora tu app puede abrir más tareas según sea necesario para actividades simultáneas adicionales de documentos. Esta función facilita la realización de varias tareas a la vez, ya que permite que los usuarios cambien rápidamente entre actividades y documentos individuales desde la pantalla de recientes, con una experiencia de cambio coherente en todas las apps.
Algunos ejemplos de estas tareas simultáneas pueden incluir pestañas abiertas en una app de navegador web, documentos en una app de productividad, partidas simultáneas en un juego o chats en una app de mensajería. Tu app puede administrar sus tareas a través de la clase ActivityManager.AppTask
.
Si deseas insertar una interrupción lógica para que el sistema trate tu actividad como una tarea nueva, usa FLAG_ACTIVITY_NEW_DOCUMENT
cuando inicies la actividad con startActivity()
. También puedes obtener este comportamiento si configuras el atributo documentLaunchMode
del elemento <activity> en "intoExisting"
o "always"
en tu manifiesto.
Para evitar saturar la pantalla de recientes, puedes establecer la cantidad máxima de tareas de tu app que pueden aparecer en esa pantalla. Para ello, establece el atributo <application> android:maxRecents
. La cantidad máxima actual que se puede especificar es de 50 tareas por usuario (25 para dispositivos con poca RAM).
Mediante configuración, se puede determinar que las tareas persistan en la pantalla de recientes tras los reinicios. Para controlar el comportamiento de persistencia, usa el atributo android:persistableMode. También puedes cambiar las propiedades visuales de una actividad en la pantalla de recientes (como el color, la etiqueta y el ícono de la actividad). Para ello, llama al método setTaskDescription()
.
Actualizaciones de WebView
En Android 5.0, se actualiza la implementación de WebView
a Chromium M37, que incluye mejoras de seguridad y estabilidad, además de correcciones de errores. Se actualizó la string de usuario-agente predeterminada para una WebView
que se ejecuta en Android 5.0 a fin de incorporar 37.0.0.0 como número de versión.
En esta versión, se presenta la clase PermissionRequest
, que permite que tu app otorgue el permiso WebView
para acceder a recursos protegidos, como la cámara y el micrófono, a través de APIs web como getUserMedia(). Tu app debe tener los permisos de Android adecuados para estos recursos a fin de otorgar los permisos a WebView
.
Con el nuevo método onShowFileChooser()
, ahora puedes usar un campo de formulario de entrada en WebView
e iniciar un selector de archivos para seleccionar imágenes y archivos del dispositivo Android.
Además, esta versión es compatible con los estándares abiertos WebAudio, WebGL y WebRTC. Para obtener más información sobre las nuevas funciones incluidas en esta versión, consulta WebView para Android.
Captura y uso compartido de pantalla
Android 5.0 te permite agregar capacidades de captura y uso compartido de pantalla a tu app con las nuevas APIs de android.media.projection
. Esta función es útil, por ejemplo, si quieres habilitar el uso compartido de pantalla en una app de videoconferencia.
El nuevo método createVirtualDisplay()
permite que tu app capture el contenido de la pantalla principal (la pantalla predeterminada) en un objeto Surface
, que luego puede enviar a través de la red. La API solo permite capturar contenido de pantalla no seguro, y no audio del sistema. Para comenzar la captura de pantalla, tu app primero debe solicitar el permiso del usuario a través del inicio de un diálogo de captura de pantalla con un Intent
obtenido a través del método createScreenCaptureIntent()
.
Para ver un ejemplo de cómo usar las nuevas APIs, consulta la clase MediaProjectionDemo
en el proyecto de muestra.
Notificaciones
Notificaciones en la pantalla bloqueada
Las pantallas de bloqueo de Android 5.0 tienen la capacidad de presentar notificaciones. Los usuarios pueden elegir a través de Configuración si quieren permitir que se muestre contenido sensible de notificaciones en una pantalla de bloqueo segura.
Tu app puede controlar el nivel de detalle visible cuando sus notificaciones se muestran en la pantalla de bloqueo segura. Para controlar el nivel de visibilidad, llama a setVisibility()
y especifica uno de estos valores:
VISIBILITY_PRIVATE
: Muestra información básica, como el ícono de la notificación, pero oculta todo su contenido.VISIBILITY_PUBLIC
: Muestra el contenido completo de la notificación.VISIBILITY_SECRET
: No muestra nada, excluye incluso el ícono de la notificación.
Cuando el nivel de visibilidad es VISIBILITY_PRIVATE
, también puedes proporcionar una versión oculta del contenido de la notificación que oculta los datos personales. Por ejemplo, una app de SMS podría mostrar una notificación con el mensaje "Tienes 3 mensajes de texto nuevos", pero oculta el contenido del mensaje y los remitentes. Para proporcionar esta notificación alternativa, primero crea la notificación de reemplazo con Notification.Builder
. Cuando crees el objeto de notificación privada, adjunta la notificación de reemplazo a este objeto mediante el método setPublicVersion()
.
Metadatos de notificaciones
Android 5.0 usa metadatos asociados con las notificaciones de tu app para ordenarlas de manera más inteligente. Para establecer los metadatos, llama a los siguientes métodos en Notification.Builder
cuando construyas la notificación:
setCategory()
: Le indica al sistema cómo controlar las notificaciones de tu app cuando el dispositivo está en modo de prioridad (por ejemplo, si una notificación representa una llamada entrante, un mensaje instantáneo o una alarma).setPriority()
: Marca la notificación como más o menos importante que las notificaciones normales. Las notificaciones con el campo de prioridad establecido enPRIORITY_MAX
oPRIORITY_HIGH
aparecen en una ventana flotante pequeña si la notificación también tiene sonido o vibración.addPerson()
: Te permite agregar a una o más personas que sean relevantes para una notificación. Tu app puede usar esto para indicar al sistema que debe agrupar las notificaciones de las personas especificadas o clasificar las notificaciones de estas personas como más importantes.
Gráficos
Compatibilidad con OpenGL ES 3.1
Android 5.0 agrega interfaces Java y compatibilidad nativa con OpenGL ES 3.1. La nueva funcionalidad clave proporcionada en OpenGL ES 3.1 incluye lo siguiente:
- sombreadores de cálculo;
- objetos independientes de sombreadores;
- comandos de dibujo indirectos;
- texturas de símbolos y multimuestra;
- mejoras del lenguaje de sombreado
- extensiones para depuración y modos de fusión avanzados;
- compatibilidad con las versiones anteriores OpenGL ES 2.0 y 3.0.
La interfaz de Java para OpenGL ES 3.1 en Android se proporciona con GLES31
. Cuando uses OpenGL ES 3.1, asegúrate de declararlo en tu archivo de manifiesto con la etiqueta <uses-feature>
y el atributo android:glEsVersion
. Por ejemplo:
<manifest> <uses-feature android:glEsVersion="0x00030001" /> ... </manifest>
Para obtener más información sobre el uso de OpenGL ES, incluida la manera de comprobar la versión de OpenGL ES compatible con el dispositivo durante el tiempo de ejecución, consulta la guía de la API de OpenGL ES.
Paquete de extensiones de Android
Además de OpenGL ES 3.1, esta versión proporciona un paquete de extensiones con interfaces Java y compatibilidad nativa para la funcionalidad de gráficos avanzados. Android trata estas extensiones como un solo paquete. (Si la extensión ANDROID_extension_pack_es31a
está presente, la app puede suponer que todas las extensiones del paquete están presentes y habilitar las funciones del lenguaje de sombreado con una sola declaración #extension
).
El paquete de extensiones admite lo siguiente:
- Compatibilidad con sombreador de fragmentos garantizada para búferes de almacenamiento de sombreador, imágenes y funciones atómicas (la compatibilidad con el sombreador de fragmentos es opcional en OpenGL ES 3.1).
- Sombreadores de geometría y teselación
- Formatos de compresión de texturas ASTC (LDR)
- Interpolación y sombreado por muestra
- Diferentes modos de fusión para cada archivo adjunto de color en un búfer de fotogramas
La interfaz Java para el paquete de extensiones se proporciona con GLES31Ext
. En el manifiesto de la app, puedes declarar que tu app debe instalarse solo en dispositivos que admiten el paquete de extensiones.
Por ejemplo:
<manifest> <uses-feature android:name=“android.hardware.opengles.aep” android:required="true" /> ... </manifest>
Contenido multimedia
Camera API para capacidades avanzadas de cámara
Android 5.0 introduce la nueva API de android.hardware.camera2 para facilitar la captura y el procesamiento de imágenes más detallados. Ahora puedes acceder de manera programática a los dispositivos de cámara disponibles para el sistema con getCameraIdList()
y conectarte a un dispositivo específico con openCamera()
.
Para comenzar a capturar imágenes, crea un CameraCaptureSession
y especifica los objetos Surface
para enviar las imágenes capturadas.
Se puede configurar CameraCaptureSession
para que tome fotos únicas o múltiples en una ráfaga.
Si deseas recibir notificaciones cuando se capturen imágenes nuevas, implementa el objeto de escucha CameraCaptureSession.CaptureCallback
y establécelo en tu solicitud de captura. Ahora, cuando el sistema completa la solicitud de captura de imágenes, el objeto de escucha CameraCaptureSession.CaptureCallback
recibe una llamada para onCaptureCompleted()
y te proporciona los metadatos de captura de imágenes en un CaptureResult
.
La clase CameraCharacteristics
permite que tu app detecte qué funciones de cámara están disponibles en un dispositivo. La propiedad INFO_SUPPORTED_HARDWARE_LEVEL
del objeto representa el nivel de funcionalidad de la cámara.
- Todos los dispositivos admiten al menos el nivel de hardware
INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
, que tiene capacidades casi equivalentes a las de la API deCamera
obsoleta. - Los dispositivos que admiten el nivel de hardware
INFO_SUPPORTED_HARDWARE_LEVEL_FULL
pueden controlarse de forma manual la captura y el procesamiento posterior, así como la captura de imágenes de alta resolución a velocidades de fotogramas altas.
Para ver cómo usar la API de Camera actualizada, consulta los ejemplos de implementación de Camera2Basic
y Camera2Video
en esta versión.
Reproducción de audio
Esta versión incluye los siguientes cambios en AudioTrack
:
- Ahora tu app puede proporcionar datos de audio en formato de punto flotante (
ENCODING_PCM_FLOAT
). Esto permite un mayor rango dinámico, una precisión más coherente y un mayor margen. La aritmética de punto flotante resulta especialmente útil durante los cálculos intermedios. Los puntos finales de reproducción usan un formato de números enteros para datos de audio, con una profundidad de bits inferior. (En Android 5.0, las partes de la canalización interna aún no son puntos flotantes). - Ahora tu app puede proporcionar datos de audio como un
ByteBuffer
, en el mismo formato que proporcionaMediaCodec
. - La opción
WRITE_NON_BLOCKING
puede simplificar el almacenamiento en búfer y varios subprocesos para algunas apps.
Control de reproducción de medios
Usa las nuevas APIs de notificación y de contenido multimedia para asegurarte de que la IU del sistema esté al tanto de tu reproducción de contenido multimedia y pueda extraer y mostrar la carátula del álbum.
El control de la reproducción de contenido multimedia en una IU y un servicio ahora es más fácil con las nuevas clases MediaSession
y MediaController
.
La nueva clase MediaSession
reemplaza a la clase RemoteControlClient
obsoleta y proporciona un solo conjunto de métodos de devolución de llamada para manejar los controles de transporte y los botones multimedia.
Si tu app proporciona reproducción de contenido multimedia y se ejecuta en la plataforma Android TV o Wear, usa la clase MediaSession
para administrar los controles de transporte con los mismos métodos de devolución de llamada.
Ahora puedes compilar tu propia app de controlador multimedia con la nueva clase MediaController
. Esta clase proporciona una forma segura para subprocesos de supervisar y controlar la reproducción de contenido multimedia desde el proceso de la IU de tu app.
Cuando crees un controlador, especifica un objeto MediaSession.Token
para que tu app pueda interactuar con el MediaSession
determinado.
Con los métodos MediaController.TransportControls
, puedes enviar comandos como play()
, stop()
, skipToNext()
y setRating()
para controlar la reproducción de contenido multimedia en esa sesión. Con el controlador, también puedes registrar un objeto MediaController.Callback
para escuchar metadatos y cambios de estado en la sesión.
Además, puedes crear notificaciones enriquecidas que permitan el control de reproducción vinculado a una sesión multimedia con la nueva clase Notification.MediaStyle
.
Navegación de contenido multimedia
Android 5.0 incorpora la capacidad de las apps para explorar la biblioteca de contenido multimedia de otra app mediante la nueva API android.media.browse. Para exponer el contenido multimedia en tu app, extiende la clase MediaBrowserService
. Tu implementación de MediaBrowserService
debe proporcionar acceso a un MediaSession.Token
para que las apps puedan reproducir contenido multimedia proporcionado a través de tu servicio.
Para interactuar con un servicio de navegador multimedia, usa la clase MediaBrowser
. Especifica el nombre del componente para una MediaSession
cuando crees una instancia MediaBrowser
. Con esa instancia del navegador, tu app puede conectarse al servicio asociado y obtener un objeto MediaSession.Token
para reproducir el contenido expuesto a través de ese servicio.
Almacenamiento
Selección de directorio
Android 5.0 amplía el framework de acceso al almacenamiento para permitir que los usuarios seleccionen un subárbol de directorio completo, lo que brinda a las apps acceso de lectura y escritura a todos los documentos contenidos sin requerir la confirmación del usuario para cada elemento.
Para seleccionar un subárbol del directorio, compila y envía un intent OPEN_DOCUMENT_TREE
. El sistema muestra todas las instancias de DocumentsProvider
que admiten la selección de subárboles, lo que permite que el usuario explore y seleccione un directorio. El URI que se muestra representa el acceso al subárbol seleccionado. Luego, puedes usar buildChildDocumentsUriUsingTree()
y buildDocumentUriUsingTree()
junto con query()
para explorar el subárbol.
El nuevo método createDocument()
te permite crear documentos o directorios nuevos en cualquier lugar del subárbol. Para administrar documentos existentes, usa renameDocument()
y deleteDocument()
.
Consulta COLUMN_FLAGS
para verificar la compatibilidad del proveedor con estas llamadas antes de emitirlas.
Si estás implementando un DocumentsProvider
y quieres admitir la selección de subárboles, implementa isChildDocument()
e incluye FLAG_SUPPORTS_IS_CHILD
en tu COLUMN_FLAGS
.
Android 5.0 también incorpora nuevos directorios de paquetes específicos en el almacenamiento compartido, en los que tu app puede colocar archivos multimedia para que se incluyan en MediaStore
. El nuevo getExternalMediaDirs()
muestra rutas de acceso a estos directorios en todos los dispositivos de almacenamiento compartido. Al igual que getExternalFilesDir()
, tu app no necesita permisos adicionales para acceder a las rutas de acceso que se muestran. La plataforma busca periódicamente contenido multimedia nuevo en estos directorios, pero también puedes usar MediaScannerConnection
para buscar contenido nuevo de forma explícita.
Conexión inalámbrica y conectividad
Conexiones de red múltiples
Android 5.0 proporciona nuevas APIs de redes múltiples que permiten que tu app busque de forma dinámica las redes disponibles con capacidades específicas y establezca una conexión con ellas. Esta funcionalidad es útil cuando tu app requiere una red especializada, como una SUPL, MMS o red de facturación del operador, o si deseas enviar datos con un tipo de protocolo de transporte determinado.
Para seleccionar una red y conectarte a ella de forma dinámica desde tu app, sigue estos pasos:
- Crea un elemento
ConnectivityManager
. - Usa la clase
NetworkRequest.Builder
para crear un objetoNetworkRequest
y especifica las características de red y el tipo de transporte que le interesa a tu app. - Para buscar redes adecuadas, llama a
requestNetwork()
oregisterNetworkCallback()
, y pasa el objetoNetworkRequest
y una implementación deConnectivityManager.NetworkCallback
. Usa el métodorequestNetwork()
si deseas cambiar de forma activa a una red adecuada una vez que se detecte. Para recibir solo notificaciones de las redes analizadas sin cambiar de forma activa, usa el métodoregisterNetworkCallback()
en su lugar.
Cuando el sistema detecta una red adecuada, se conecta a ella e invoca la devolución de llamada onAvailable()
. Puedes usar el objeto Network
de la devolución de llamada para obtener información adicional sobre la red o indicar al tráfico que use la red seleccionada.
Bluetooth de bajo consumo
Android 4.3 introdujo compatibilidad de plataforma para Bluetooth de bajo consumo (Bluetooth LE) en el rol central. En Android 5.0, un dispositivo Android ahora puede actuar como un dispositivo periférico Bluetooth LE. Las apps pueden usar esta capacidad para que los dispositivos cercanos detecten su presencia. Por ejemplo, puedes compilar apps que permitan que un dispositivo funcione como podómetro o como monitor de estado, y comunique sus datos con otro dispositivo Bluetooth LE.
Las nuevas APIs de android.bluetooth.le
permiten que tus apps transmitan anuncios, busquen respuestas y establezcan conexiones con dispositivos Bluetooth de bajo consumo cercanos. Para usar las nuevas funciones de publicidad y análisis, agrega el permiso BLUETOOTH_ADMIN
en tu manifiesto. Cuando los usuarios actualizan o descargan tu app desde Play Store, se les solicita que otorguen el siguiente permiso a la app: "Información de conexión Bluetooth: Permite que la app controle el Bluetooth, incluida la transmisión de información a dispositivos Bluetooth cercanos o la obtención de información sobre ellos".
Si deseas comenzar la publicidad por Bluetooth LE para que otros dispositivos puedan descubrir tu app, llama a startAdvertising()
y pasa una implementación de la clase AdvertiseCallback
. El objeto de devolución de llamada recibe un informe del éxito o fracaso de la operación de publicidad.
Android 5.0 presenta la clase ScanFilter
para que tu app pueda buscar solo los tipos específicos de dispositivos que le interesan. Para comenzar a buscar dispositivos Bluetooth LE, llama a startScan()
y envía una lista de filtros. En la llamada de método, también debes proporcionar una implementación de ScanCallback
para informar cuando se encuentra un anuncio de Bluetooth LE.
Mejoras de NFC
Android 5.0 agrega estas mejoras para permitir un uso más amplio y flexible de NFC:
- Android Beam ahora está disponible en el menú Compartir.
- Tu app puede invocar a Android Beam en el dispositivo del usuario para compartir datos llamando a
invokeBeam()
. Esto evita la necesidad de que el usuario presione manualmente el dispositivo contra otro dispositivo compatible con NFC para completar la transferencia de datos. - Puedes usar el nuevo método
createTextRecord()
para crear un registro NDEF que contenga datos de texto UTF-8. - Si estás desarrollando una app de pagos, ahora tienes la capacidad de registrar un ID de aplicación (AID) de NFC de forma dinámica llamando a
registerAidsForService()
. También puedes usarsetPreferredService()
para establecer el servicio de emulación de tarjeta preferido que se debe usar cuando una actividad específica está en primer plano.
Proyecto Volta
Además de las nuevas funciones, Android 5.0 enfatiza las mejoras en la duración de la batería. Usa las nuevas APIs y herramienta para comprender y optimizar el consumo de energía de tu app.
Programación de trabajos
Android 5.0 proporciona una nueva API de JobScheduler
que te permite optimizar la duración de la batería a través de la definición de trabajos para que el sistema ejecute de forma asíncrona en otro momento o en condiciones específicas (por ejemplo, cuando se está cargando el dispositivo). La programación de trabajos es útil en situaciones como las siguientes:
- En la app hay trabajos en segundo plano que puedes posponer.
- La app tiene trabajos que preferirías hacer con la unidad enchufada.
- La app tiene una tarea que requiere acceso a la red o una conexión Wi-Fi.
- La app tiene varias tareas que deseas que se ejecuten por lote de forma periódica.
Una unidad de trabajo está encapsulada por un objeto JobInfo
.
Este objeto especifica los criterios de programación.
Usa la clase JobInfo.Builder
para configurar cómo se debe ejecutar la tarea programada. Puedes programar la tarea para que se ejecute en condiciones específicas, como estas:
- Empezar cuando el dispositivo se esté cargando.
- Empezar cuando el dispositivo esté conectado a una red no medida.
- Empezar cuando el dispositivo esté inactivo.
- Finalizar antes de un determinado plazo o con una demora mínima.
Por ejemplo, puedes agregar un código como el que se muestra a continuación para ejecutar tu tarea en una red no medida:
Kotlin
val uploadTask: JobInfo = JobInfo.Builder( jobId, serviceComponent /* JobService component */ ).run { setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) build() } val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler jobScheduler.schedule(uploadTask)
Java
JobInfo uploadTask = new JobInfo.Builder(jobId, serviceComponent /* JobService component */) .setRequiredNetworkCapabilities(JobInfo.NETWORK_TYPE_UNMETERED) .build(); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(uploadTask);
Si el dispositivo tiene energía estable (es decir, estuvo conectado durante más de 2 minutos y la batería está en un nivel óptimo), el sistema ejecutará cualquier trabajo programado que esté listo para ejecutarse, incluso si la fecha límite del trabajo no venció.
Para ver un ejemplo de cómo usar la API de JobScheduler
, consulta la muestra de implementación de JobSchedulerSample
en esta versión.
Herramientas de desarrolladores para el uso de batería
El nuevo comando dumpsys batterystats
genera datos estadísticos interesantes sobre el uso de la batería en un dispositivo, organizados por ID de usuario único (UID). Las estadísticas incluyen lo siguiente:
- historial de eventos relacionados con la batería;
- Estadísticas globales para el dispositivo
- Uso de energía aproximado por UID y componente de sistema
- ms por paquete de dispositivos móviles por app;
- Estadísticas globales de UID de sistema
- Estadísticas globales de UID de la app
Usa la opción --help
para conocer las distintas opciones para adaptar el resultado. Por ejemplo, para imprimir las estadísticas de uso de batería de un paquete de apps determinado desde la última carga del dispositivo, ejecuta el siguiente comando:
$ adb shell dumpsys batterystats --charged <package-name>
Puedes usar la herramienta Battery Historian en el resultado del comando dumpsys
para generar una visualización HTML de los eventos relacionados con la batería a partir de los registros. Esta información te permite comprender y diagnosticar cualquier problema relacionado con la batería.
Android en el entorno de trabajo y educativo
Aprovisionamiento administrado
Android 5.0 proporciona nuevas funciones para ejecutar apps dentro de un entorno empresarial. Un administrador de dispositivos puede iniciar un proceso de aprovisionamiento administrado para agregar un perfil administrado que se presenta en conjunto, pero que es independiente, a un dispositivo, si el usuario ya tiene una cuenta personal. Las apps asociadas con perfiles administrados aparecen junto a las apps no administradas en el Selector, la pantalla de recientes y las notificaciones del usuario.
Para iniciar el proceso de aprovisionamiento administrado, envía ACTION_PROVISION_MANAGED_PROFILE
en un Intent
. Si la llamada se realiza correctamente, el sistema activa la devolución de llamada onProfileProvisioningComplete()
.
Luego, puedes llamar a setProfileEnabled()
para habilitar este perfil administrado.
De manera predeterminada, solo un pequeño subconjunto de apps se habilitan en el perfil administrado.
Puedes instalar apps adicionales en el perfil administrado llamando a enableSystemApp()
.
Si estás desarrollando una app de Launcher, puedes usar la nueva clase LauncherApps
para obtener una lista de las actividades que se pueden iniciar para el usuario actual y cualquier perfil administrado asociado. Tu Selector puede agregar una insignia de trabajo al elemento de diseño del ícono para que las apps administradas se destaquen visualmente. Para recuperar el ícono con insignia, llama a getUserBadgedIcon()
.
Para ver cómo usar la nueva funcionalidad, consulta la muestra de implementación de BasicManagedProfile
en esta versión.
Propietario del dispositivo
Android 5.0 introduce la capacidad de implementar una app de propietario de dispositivo. Un propietario de dispositivo es un tipo especializado de administrador de dispositivos que tiene la capacidad adicional de crear y quitar usuarios secundarios, y de establecer la configuración global en el dispositivo. La app de propietario del dispositivo puede usar los métodos de la clase DevicePolicyManager
para obtener un control detallado de la configuración, la seguridad y las apps en los dispositivos administrados.
Un dispositivo puede tener solamente un propietario de dispositivo activo a la vez.
Para implementar y activar un propietario de dispositivo, debes realizar una transferencia de datos NFC desde una app de programación al dispositivo mientras este se encuentra en estado no aprovisionado. Esta transferencia de datos envía la misma información que el intent de aprovisionamiento que se describe en Aprovisionamiento administrado.
Fijar pantalla
Android 5.0 presenta una nueva API de fijación de pantalla que te permite impedir temporalmente que los usuarios salgan de tu tarea o sean interrumpidos por notificaciones. Podría usarse, por ejemplo, si estás desarrollando una app educativa para cumplir con los requisitos de evaluación de gran importancia en Android, o una aplicación de un solo propósito o de kiosco. Una vez que tu app active la fijación de pantalla, los usuarios no podrán ver las notificaciones, acceder a otras apps ni volver a la pantalla principal hasta que tu app salga del modo.
Existen dos maneras de activar la fijación de pantalla:
- Manualmente: los usuarios pueden habilitar la fijación de pantalla en Configuración > Seguridad > Fijar pantalla y seleccionar las tareas que desean fijar tocando el ícono de fijar verde en la pantalla de recientes.
- De manera programática: Para activar la fijación de pantalla de manera programática, llama a
startLockTask()
desde tu app. Si la app solicitante no es un propietario del dispositivo, se le solicitará confirmación al usuario. Una app de propietario de dispositivo puede llamar al métodosetLockTaskPackages()
para permitir que las apps se puedan fijar sin el paso de confirmación del usuario.
Cuando el bloqueo de tareas está activo, ocurre lo siguiente:
- La barra de estado está en blanco, y las notificaciones de usuario y la información de estado están ocultas.
- Los botones Home y Recent Apps están ocultos.
- Otras apps no pueden iniciar actividades nuevas.
- La app actual puede iniciar actividades nuevas, siempre y cuando no cree tareas nuevas.
- Cuando un propietario del dispositivo invoca la fijación de pantalla, el usuario no puede acceder a tu app hasta que esta llama a
stopLockTask()
. - Si otra app que no es el propietario del dispositivo o el usuario activa la fijación de pantalla directamente, el usuario puede salir de ella manteniendo presionados los botones Atrás y Recientes.
Framework de impresión
Representación de PDF como mapa de bits
Ahora puedes renderizar páginas de documentos PDF en imágenes de mapa de bits para imprimir mediante la nueva clase PdfRenderer
. Debes especificar un ParcelFileDescriptor
que admita búsquedas (es decir, que se pueda acceder al contenido de forma aleatoria) en el que el sistema escriba el contenido imprimible.
Tu app puede obtener una página para renderizar con openPage()
y, luego, llamar a render()
para convertir el objeto PdfRenderer.Page
abierto en un mapa de bits. También puedes establecer parámetros adicionales si solo deseas convertir una parte del documento en una imagen de mapa de bits (por ejemplo, para implementar la renderización de mosaicos y acercar el documento).
Para ver un ejemplo de cómo usar las nuevas APIs, consulta la muestra de PdfRendererBasic
.
Sistema
Estadísticas de uso de apps
Ahora puedes acceder al historial de uso de las apps en un dispositivo Android con la nueva API de android.app.usage
. Esta API proporciona información de uso más detallada que el método obsoleto getRecentTasks()
.
Para usar esta API, primero debes declarar el permiso "android.permission.PACKAGE_USAGE_STATS"
en tu manifiesto.
El usuario también debe habilitar el acceso para esta app a través de Configuración > Seguridad > Apps con acceso de uso.
El sistema recopila los datos de uso por app y agrega los datos en intervalos diarios, semanales, mensuales y anuales. El tiempo máximo durante el cual el sistema conserva estos datos es el siguiente:
- Datos diarios: 7 días
- Datos semanales: 4 semanas
- Datos mensuales: 6 meses
- Datos anuales: 2 años
Para cada app, el sistema registra los siguientes datos:
- la última vez que se usó la app;
- La cantidad total de tiempo que la app estuvo en primer plano durante ese intervalo (por día, semana, mes o año)
- Captura de marca de tiempo del momento en que un componente (identificado por un nombre de actividad y paquete) se movió a primer o segundo plano durante un día
- Captura de marca de tiempo del momento en que cambió la configuración de un dispositivo (por ejemplo, cuando cambió la orientación del dispositivo debido a la rotación)
Pruebas y accesibilidad
Mejoras de pruebas y accesibilidad
En Android 5.0, se agrega la siguiente compatibilidad con las pruebas y la accesibilidad:
- Los nuevos métodos
getWindowAnimationFrameStats()
ygetWindowContentFrameStats()
capturan estadísticas de fotogramas para animaciones de ventanas y contenido. Estos métodos te permiten escribir pruebas de instrumentación para evaluar si una app renderiza fotogramas con una frecuencia de actualización suficiente que brinde una experiencia del usuario fluida. - El nuevo método
executeShellCommand()
te permite ejecutar comandos de shell desde tu prueba de instrumentación. La ejecución de comandos es similar a ejecutaradb shell
desde un host conectado al dispositivo, lo que te permite usar herramientas basadas en shell, comodumpsys
,am
,content
ypm
. - Los servicios de accesibilidad y las herramientas de prueba que usan las APIs de accesibilidad (como
UiAutomator
) ahora pueden recuperar información detallada sobre las propiedades de las ventanas en la pantalla con las que pueden interactuar los usuarios videntes. Para recuperar una lista de objetosAccessibilityWindowInfo
, llama al nuevo métodogetWindows()
. - La nueva clase
AccessibilityNodeInfo.AccessibilityAction
te permite definir acciones estándar o personalizadas para realizar en unAccessibilityNodeInfo
. La nueva claseAccessibilityNodeInfo.AccessibilityAction
reemplaza las APIs relacionadas con acciones que se encontraban antes enAccessibilityNodeInfo
. - Android 5.0 ofrece un control más detallado sobre la síntesis de texto a voz en tu app. La nueva clase
Voice
permite que tu app use perfiles de voz asociados con configuraciones regionales específicas, clasificaciones de calidad y latencia, y parámetros específicos del motor de texto a voz.
IME
Simplificación del cambio de idiomas de escritura
A partir de Android 5.0, los usuarios pueden cambiar más fácilmente entre todos los editores de método de entrada (IME) compatibles con la plataforma. La ejecución de la acción de cambio designada (por lo general, tocar un ícono del globo terráqueo en el teclado en pantalla) pasa por todos esos IME. El método shouldOfferSwitchingToNextInputMethod()
implementa este cambio de comportamiento.
Además, el framework ahora verifica si el siguiente IME incluye un mecanismo de cambio (y, por lo tanto, si ese IME admite el cambio al IME posterior). Un IME con un mecanismo de cambio no pasará a uno que no lo tenga. El método switchToNextInputMethod()
implementa este cambio de comportamiento.
Para ver un ejemplo de cómo usar las APIs de cambio de IME actualizadas, consulta el ejemplo de implementación de teclado en pantalla actualizado en esta versión. Si quieres obtener más información para implementar el cambio entre IME, consulta Cómo crear un método de entrada.
Declaraciones de manifiesto
Funciones requeridas declarables
Los siguientes valores ahora son compatibles con el elemento <uses-feature>
, por lo que podrás asegurarte de que tu app se instale solo en dispositivos que proporcionen las funciones que necesite.
FEATURE_AUDIO_OUTPUT
FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING
FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR
FEATURE_CAMERA_CAPABILITY_RAW
FEATURE_CAMERA_LEVEL_FULL
FEATURE_GAMEPAD
FEATURE_LIVE_TV
FEATURE_MANAGED_USERS
FEATURE_LEANBACK
FEATURE_OPENGLES_EXTENSION_PACK
FEATURE_SECURELY_REMOVES_USERS
FEATURE_SENSOR_AMBIENT_TEMPERATURE
FEATURE_SENSOR_HEART_RATE_ECG
FEATURE_SENSOR_RELATIVE_HUMIDITY
FEATURE_VERIFIED_BOOT
FEATURE_WEBVIEW
Permisos del usuario
Ahora se admite el siguiente permiso en el elemento <uses-permission>
para declarar los permisos que requiere tu app para acceder a determinadas APIs.
BIND_DREAM_SERVICE
: Cuando se orienta al nivel de API 21 o versiones posteriores, un servicio de Daydream requiere este permiso para garantizar que solo el sistema pueda vincularse a él.