Nivel de API: 21
Android 5.0 (LOLLIPOP) ofrece nuevas funciones para los usuarios y los desarrolladores de apps. En este documento, se proporciona una
introducción a las APIs nuevas más destacadas.
Si tienes una app publicada, asegúrate de consultar los cambios de comportamiento de Android 5.0 que debes tener en cuenta en tu app. Estos cambios de comportamiento pueden afectar a tu app en dispositivos con Android 5.0, incluso si no usas APIs nuevas ni te orientas a nuevas funciones.
Para obtener una descripción general de las nuevas funciones de la plataforma, consulta los aspectos destacados de Android Lollipop.
Empezar a programar
Para comenzar a compilar apps para Android 5.0, primero debes obtener el SDK de Android. Luego, usa el SDK Manager para descargar la plataforma del SDK y las imágenes del sistema de Android 5.0.
Actualiza el nivel de API objetivo
Para optimizar mejor tu app para dispositivos que ejecutan Android 5.0, establece tu targetSdkVersion en "21", instala tu 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 agregando condiciones a tu código que verifiquen el nivel de API del sistema antes de ejecutar las APIs que no admite tu minSdkVersion.
Para obtener más información sobre cómo mantener la retrocompatibilidad, consulta Cómo admitir 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?
Cambios de comportamiento importantes
Si ya publicaste una app para Android, ten en cuenta que los cambios en Android 5.0 podrían afectarla.
Consulta Cambios en Android 5.0 para obtener información completa.
Interfaz de usuario
Compatibilidad con Material Design
Android 5.0 agrega compatibilidad con el nuevo estilo de Material Design de Android. Puedes crear apps con Material Design que sean visualmente dinámicas y tengan transiciones de elementos de la IU que resulten naturales para los usuarios. Esta asistencia incluye lo siguiente:
- El tema de Material
- Ver sombras
- El widget
RecyclerView - Animación de elementos de diseño y efectos de diseño
- Efectos de animación y transición de actividades de Material Design
- Animadores para las propiedades de la vista según su estado
- Widgets de IU y barras de la app personalizables con paletas de colores que tú controlas
- Elementos de diseño animados y no animados basados en 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 simultáneos en la pantalla de recientes
En versiones anteriores, la pantalla Recientes solo podía mostrar una tarea para cada app con la que el usuario interactuó 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.
Entre los ejemplos de estas tareas simultáneas, se 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.
Para insertar una interrupción lógica de modo 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> como "intoExisting" o "always" en tu manifiesto.
Para evitar que se sature la pantalla de Recientes, puedes establecer la cantidad máxima de tareas de tu app que pueden aparecer en esa pantalla. Para ello, configura el atributo android:maxRecents de <application>. El máximo actual que se puede especificar es de 50 tareas por usuario (25 para dispositivos con poca RAM).
Las tareas de la pantalla de Recientes se pueden configurar para que persistan después de los reinicios. Para controlar el comportamiento de persistencia, usa el atributo android:persistableMode. También puedes llamar al método setTaskDescription() para cambiar las propiedades visuales de una actividad en la pantalla Recientes, como el color, la etiqueta y el ícono de la actividad.
Actualizaciones de WebView
Android 5.0 actualiza la implementación de WebView a Chromium M37, lo que aporta mejoras de seguridad y estabilidad, así como correcciones de errores. Se actualizó la cadena de usuario-agente predeterminada para un WebView que se ejecuta en Android 5.0 para incorporar 37.0.0.0 como el 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
y abrir un selector de archivos para elegir imágenes y archivos del dispositivo Android.
Además, esta versión incluye compatibilidad con los estándares abiertos WebAudio, WebGL y WebRTC. Para obtener más información sobre las nuevas funciones que se incluyen en esta versión, consulta WebView para Android.
Captura de pantalla y compartir pantalla
Android 5.0 te permite agregar funciones de captura de pantalla y compartir pantalla a tu app con las nuevas APIs de android.media.projection. Esta funcionalidad es útil, por ejemplo, si quieres habilitar la función de compartir pantalla en una aplicación 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 tu app puede enviar a través de la red. La API solo permite capturar contenido de pantalla no seguro, y no el audio del sistema. Para comenzar la captura de pantalla, tu app primero debe solicitar el permiso del usuario. Para ello, debe iniciar 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 APIs nuevas, consulta la clase MediaProjectionDemo en el proyecto de ejemplo.
Notificaciones
Notificaciones en la pantalla bloqueada
Las pantallas de bloqueo de Android 5.0 pueden mostrar notificaciones. Los usuarios pueden elegir en Configuración si desean permitir que se muestre contenido de notificaciones sensible en una pantalla de bloqueo segura.
Tu app puede controlar el nivel de detalle visible cuando se muestran sus notificaciones 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 el contenido completo de la notificación.VISIBILITY_PUBLIC: Muestra el contenido completo de la notificación.VISIBILITY_SECRET: No muestra nada, ni siquiera el ícono de la notificación.
Cuando el nivel de visibilidad es VISIBILITY_PRIVATE,
también puedes proporcionar una versión redactada del contenido de la notificación
que oculte los detalles personales. Por ejemplo, una app de SMS podría mostrar una
notificación que diga "Tienes 3 mensajes de texto nuevos", pero ocultar el contenido
y los remitentes de los mensajes. Para proporcionar esta notificación alternativa, primero crea la notificación de reemplazo con Notification.Builder. Cuando crees el objeto de notificación privada, adjúntale la notificación de reemplazo a través del 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 configurar los metadatos, llama a los siguientes métodos en Notification.Builder cuando construyas la notificación:
setCategory(): 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_MAXoPRIORITY_HIGHaparecen en una pequeña ventana flotante si la notificación también tiene sonido o vibración.addPerson(): Te permite agregar una o más personas que sean relevantes para una notificación. Tu app puede usar este método para indicarle al sistema que debe agrupar las notificaciones de las personas especificadas o clasificarlas como más importantes.
Gráficos
Compatibilidad con OpenGL ES 3.1
Android 5.0 agrega interfaces de Java y compatibilidad nativa con OpenGL ES 3.1. Entre las nuevas funciones clave que se proporcionan en OpenGL ES 3.1, se incluyen las siguientes:
- Sombreadores de procesamiento
- Objetos de sombreador independientes
- Comandos de dibujo indirectos
- Texturas de plantilla y de muestreo múltiple
- Mejoras en el lenguaje de sombreado
- Extensiones para modos de fusión avanzados y depuración
- Retrocompatibilidad con 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.
Android Extension Pack
Además de OpenGL ES 3.1, esta versión proporciona un paquete de extensiones con interfaces de Java y compatibilidad nativa con funciones de gráficos avanzadas. Android trata estas extensiones como un solo paquete. (Si la extensión ANDROID_extension_pack_es31a está presente, tu app puede suponer que todas las extensiones del paquete están presentes y habilitar las funciones del lenguaje de sombreado con una sola sentencia #extension).
El paquete de extensiones admite lo siguiente:
- Se requiere compatibilidad con sombreadores de fragmentos para búferes de almacenamiento de sombreadores, imágenes y operaciones atómicas (la compatibilidad con sombreadores de fragmentos es opcional en OpenGL ES 3.1).
- Sombreadores de teselación y geometría
- Formato de compresión de texturas ASTC (LDR)
- Interpolación y sombreado por muestra
- Diferentes modos de fusión para cada adjunto de color en un búfer de fotogramas
La interfaz de Java para el paquete de extensiones se proporciona con GLES31Ext. En el manifiesto de la app, puedes declarar que esta solo se debe instalar en dispositivos que admitan el paquete de extensiones.
Por ejemplo:
<manifest>
<uses-feature android:name="android.hardware.opengles.aep"
android:required="true" />
...
</manifest>Medios
API de Camera para funciones avanzadas de la cámara
Android 5.0 presenta la nueva API de android.hardware.camera2 para facilitar la captura de fotos y el procesamiento de imágenes 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.
La CameraCaptureSession se puede configurar para
tomar fotos individuales o varias imágenes en una ráfaga.
Para recibir una notificación cuando se capturen imágenes nuevas, implementa el objeto de escucha CameraCaptureSession.CaptureCallback y configúralo en tu solicitud de captura. Ahora, cuando el sistema complete la solicitud de captura de imágenes, tu objeto de escucha CameraCaptureSession.CaptureCallback recibirá una llamada a onCaptureCompleted(), que te proporcionará los metadatos de captura de imágenes en un CaptureResult.
La clase CameraCharacteristics permite que tu app detecte qué funciones de la 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 aproximadamente equivalentes a las de la API deCameraobsoleta. - Los dispositivos que admiten el nivel de hardware
INFO_SUPPORTED_HARDWARE_LEVEL_FULLpueden controlar de forma manual la captura y el procesamiento posterior, y capturar imágenes de alta resolución con 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
En esta versión, se incluyen 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 de seguridad. La aritmética de punto flotante es especialmente útil durante los cálculos intermedios. Los extremos de reproducción usan el formato de número entero para los datos de audio y con una profundidad de bits más baja. (En Android 5.0, algunas partes de la canalización interna aún no son de punto flotante). - Ahora, tu app puede proporcionar datos de audio como un
ByteBuffer, en el mismo formato que proporcionaMediaCodec. - La opción
WRITE_NON_BLOCKINGpuede simplificar el almacenamiento en búfer y el multiprocesamiento para algunas apps.
Control de reproducción de contenido multimedia
Usa las nuevas APIs de notificaciones y contenido multimedia para asegurarte de que la IU del sistema conozca tu reproducción de contenido multimedia y pueda extraer y mostrar la imagen del álbum.
Ahora, controlar la reproducción de contenido multimedia en una IU y un servicio es más fácil con las nuevas clases MediaSession y MediaController.
La nueva clase MediaSession reemplaza la clase RemoteControlClient obsoleta y proporciona un único conjunto de métodos de devolución de llamada para controlar los controles de transporte y los botones de contenido multimedia.
Si tu app proporciona reproducción de contenido multimedia y se ejecuta en la plataforma de Android TV o Wear, usa la clase MediaSession para controlar los controles de transporte con los mismos métodos de devolución de llamada.
Ahora puedes compilar tu propia app de controlador de contenido multimedia con la nueva clase MediaController. Esta clase proporciona
una forma con protección de subprocesos para 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 los cambios de metadatos y estado en la sesión.
Además, puedes crear notificaciones enriquecidas que permitan los controles de reproducción vinculados a una sesión multimedia con la nueva clase Notification.MediaStyle.
Navegación de contenido multimedia
Android 5.0 presenta la capacidad de que las apps exploren la biblioteca de contenido multimedia de otra app a través de la nueva API de 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 el contenido multimedia que se proporciona a través de tu servicio.
Para interactuar con un servicio de navegador multimedia, usa la clase MediaBrowser. Especifica el nombre del componente
para un MediaSession cuando crees una
instancia de MediaBrowser. Con esa instancia de 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 extiende el framework de acceso al almacenamiento para permitir que los usuarios seleccionen un subárbol de directorio completo, lo que otorga a las apps acceso de lectura y escritura a todos los documentos contenidos sin necesidad de confirmación del usuario para cada elemento.
Para seleccionar un subárbol de 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().
Verifica COLUMN_FLAGS para comprobar la compatibilidad del proveedor con estas llamadas antes de emitirlas.
Si implementas un DocumentsProvider y quieres admitir la selección de subárboles, implementa isChildDocument() y, luego, incluye FLAG_SUPPORTS_IS_CHILD en tu COLUMN_FLAGS.
Android 5.0 también presenta nuevos directorios específicos de paquetes en el almacenamiento compartido, donde tu app puede colocar archivos multimedia para incluirlos en MediaStore. La nueva clase getExternalMediaDirs() devuelve rutas de acceso a estos directorios en todos los dispositivos de almacenamiento compartido. Al igual que con getExternalFilesDir(), tu app no necesita permisos adicionales para acceder a las rutas de acceso devueltas. La plataforma analiza periódicamente estos directorios en busca de contenido multimedia nuevo, pero también puedes usar MediaScannerConnection para buscar contenido nuevo de forma explícita.
Conectividad inalámbrica
Varias conexiones de red
Android 5.0 proporciona nuevas APIs de redes múltiples que permiten que tu app busque de forma dinámica 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 red de SUPL, MMS o de facturación del operador, o si quieres enviar datos con un tipo de protocolo de transporte en particular.
Para seleccionar una red y conectarte a ella de forma dinámica desde tu app, sigue estos pasos:
- Crea un
ConnectivityManager. - Usa la clase
NetworkRequest.Builderpara crear un objetoNetworkRequesty especificar las funciones de red y el tipo de transporte que le interesan a tu app. - Para buscar redes adecuadas, llama a
requestNetwork()oregisterNetworkCallback(), y pasa el objetoNetworkRequesty una implementación deConnectivityManager.NetworkCallback. Usa el métodorequestNetwork()si quieres 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().
Cuando el sistema detecta una red adecuada, se conecta a ella y, luego, 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 para dirigir el tráfico de modo que use la red seleccionada.
Bluetooth de bajo consumo
En Android 4.3, se introdujo la compatibilidad de la plataforma con el 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 de Bluetooth de bajo consumo. Las apps pueden usar esta función para dar a conocer su presencia a los dispositivos cercanos. Por ejemplo, puedes compilar apps que permitan que un dispositivo funcione como podómetro o monitor de salud, y que comunique sus datos con otro dispositivo Bluetooth de bajo consumo.
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 anuncio 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 le otorguen el siguiente permiso: "Información de conexión Bluetooth: Permite que la app controle el Bluetooth, lo que incluye transmitir a dispositivos Bluetooth cercanos o recibir información sobre ellos".
Para comenzar con la publicidad de Bluetooth de bajo consumo y 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 el 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 de bajo consumo, llama a startScan() y pasa una lista de filtros. En la llamada de método, también debes proporcionar una implementación de ScanCallback para informar cuando se encuentre un anuncio de Bluetooth de bajo consumo.
Mejoras de NFC
Android 5.0 agrega estas mejoras para permitir un uso más amplio y flexible de NFC:
- Android Beam ya está disponible en el menú Compartir.
- Tu app puede invocar Android Beam en el dispositivo del usuario para compartir datos llamando a
invokeBeam(). Esto evita que el usuario tenga que acercar manualmente el dispositivo a otro 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 puedes 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 tarjetas preferido que se debe usar cuando una actividad específica está en primer plano.
Project Volta
Además de las funciones nuevas, Android 5.0 hace hincapié en las mejoras de la duración de batería. Usa las nuevas APIs y la herramienta para comprender y optimizar el consumo de energía de tu app.
Programa trabajos
Android 5.0 proporciona una nueva API de JobScheduler que te permite optimizar la duración de la batería definiendo trabajos para que el sistema los ejecute de forma asíncrona más adelante o en condiciones específicas (como cuando el dispositivo se está cargando). La programación de trabajos es útil en situaciones como las siguientes:
- La app tiene trabajo que no es para el usuario y que puedes diferir.
- La app tiene trabajo que preferirías hacer cuando la unidad está enchufada.
- La app tiene una tarea que requiere acceso a la red o una conexión Wi-Fi.
- La app tiene una serie de tareas que quieres ejecutar como un lote de forma periódica.
Una unidad de trabajo se encapsula en 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 las siguientes:
- Iniciar cuando el dispositivo se esté cargando
- Iniciar cuando el dispositivo esté conectado a una red de uso no medido
- Iniciar cuando el dispositivo esté inactivo
- Terminar antes de una fecha límite determinada o con un retraso mínimo
Por ejemplo, puedes agregar un código como este 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 una alimentación estable (es decir, estuvo enchufado durante más de 2 minutos y la batería se encuentra en un nivel saludable), el sistema ejecutará cualquier trabajo programado que esté listo para ejecutarse, incluso si no venció la fecha límite del trabajo.
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 para desarrolladores para el uso de la batería
El nuevo comando dumpsys batterystats genera datos estadísticos interesantes sobre el uso de batería de 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
- Milisegundos por paquete en 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 que tienes para
personalizar el resultado. Por ejemplo, para imprimir las estadísticas de uso de la batería de un paquete de app determinado desde la última vez que se cargó el dispositivo, ejecuta este comando:
$ adb shell dumpsys batterystats --charged <package-name>
Puedes usar la herramienta de Battery Historian en el resultado del comando dumpsys para generar una visualización en HTML de los eventos relacionados con la batería a partir de los registros. Esta información te facilita comprender y diagnosticar cualquier problema relacionado con la batería.
Android en el lugar de trabajo y en la educación
Aprovisionamiento administrado
Android 5.0 proporciona nuevas funciones para ejecutar apps en un entorno empresarial. Un administrador de dispositivos puede iniciar un proceso de aprovisionamiento administrado para agregar un perfil administrado copresente, pero independiente, a un dispositivo, si el usuario tiene una cuenta personal existente. Las apps asociadas con perfiles administrados aparecen junto con 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 forma predeterminada, solo un pequeño subconjunto de apps está habilitado en el perfil administrado.
Puedes instalar apps adicionales en el perfil administrado llamando a enableSystemApp().
Si estás desarrollando una app de selector, puedes usar la nueva clase LauncherApps para obtener una lista de actividades que se pueden iniciar para el usuario actual y los perfiles administrados asociados. Tu selector puede hacer que las apps administradas se destaquen visualmente agregando una insignia de trabajo al elemento de diseño del ícono. Para recuperar el ícono con insignia, llama a
getUserBadgedIcon().
Para ver cómo usar la nueva funcionalidad, consulta el ejemplo de implementación de BasicManagedProfile en esta versión.
Propietario del dispositivo
Android 5.0 presenta la capacidad de implementar una app de propietario del dispositivo. Un propietario del 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 del dispositivo. La app de propietario del dispositivo puede usar los métodos de la clase DevicePolicyManager para controlar de forma detallada la configuración, la seguridad y las apps de los dispositivos administrados.
Un dispositivo solo puede tener un propietario activo a la vez.
Para implementar y activar un propietario del dispositivo, debes realizar una transferencia de datos de NFC desde una app de programación al dispositivo mientras este se encuentra en su estado sin aprovisionar. Esta transferencia de datos envía la misma información que en 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 restringir temporalmente que los usuarios abandonen tu tarea o que las notificaciones los interrumpan. Esto se podría usar, por ejemplo, si estás desarrollando una app educativa para admitir requisitos de evaluación de alto riesgo en Android, o una aplicación de un solo propósito o de kiosco. Una vez que tu app activa la fijación de pantalla, los usuarios no pueden ver notificaciones, acceder a otras apps ni regresar 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 quieren fijar tocando el ícono de fijación 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 que realiza la solicitud no es un propietario del dispositivo, se le pedirá confirmación al usuario. Una app de propietario del dispositivo puede llamar al métodosetLockTaskPackages()para permitir que las apps se fijen sin el paso de confirmación del usuario.
Cuando el bloqueo de tareas está activo, se produce el siguiente comportamiento:
- La barra de estado está en blanco, y las notificaciones del usuario y la información de estado están ocultas.
- Los botones de inicio y de apps recientes están ocultos.
- Otras apps no pueden iniciar actividades nuevas.
- La app actual puede iniciar actividades nuevas, siempre que no se creen tareas nuevas.
- Cuando el propietario de un dispositivo invoca la fijación de pantalla, el usuario permanece bloqueado en tu app hasta que esta llama a
stopLockTask(). - Si otra app que no es propietaria del dispositivo o el usuario directamente activan la fijación de pantalla, el usuario puede salir manteniendo presionados los botones Atrás y Recientes.
Framework de impresión
Renderiza un PDF como mapa de bits
Ahora puedes renderizar páginas de documentos PDF en imágenes de mapa de bits para imprimirlas con la nueva clase PdfRenderer. Debes especificar un ParcelFileDescriptor que se pueda buscar (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 PdfRenderer.Page abierto en un mapa de bits. También
puedes establecer parámetros adicionales si solo quieres convertir una parte del
documento en una imagen de mapa de bits (por ejemplo, para implementar
la renderización en mosaico
y acercar el documento).
Para ver un ejemplo de cómo usar las APIs nuevas, consulta la muestra de PdfRendererBasic.
Sistema
Estadísticas de uso de aplicacione
Ahora puedes acceder al historial de uso de la app 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 getRecentTasks() obsoleto.
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 en Configuración > Seguridad > Apps con acceso a los datos de uso.
El sistema recopila los datos de uso por app y los agrega en intervalos diarios, semanales, mensuales y anuales. La duración máxima que el sistema conserva estos datos es la 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
- Es la cantidad total de tiempo que la app estuvo en primer plano durante ese intervalo de tiempo (por día, semana, mes o año).
- Marca de tiempo que captura cuando un componente (identificado por un nombre de paquete y actividad) se movió al primer o segundo plano durante un día
- Marca de tiempo que captura el 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 en las pruebas y la accesibilidad
Android 5.0 agrega la siguiente compatibilidad para pruebas y accesibilidad:
- Los nuevos métodos
getWindowAnimationFrameStats()ygetWindowContentFrameStats()capturan estadísticas de fotogramas para las animaciones y el contenido de las ventanas. Estos métodos te permiten escribir pruebas de instrumentación para evaluar si una app renderiza fotogramas con una frecuencia de actualización suficiente para proporcionar 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 del comando es similar a ejecutaradb shelldesde un host conectado al dispositivo, lo que te permite usar herramientas basadas en shell, comodumpsys,am,contentypm. - 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.AccessibilityActionte permite definir acciones estándares o personalizadas para realizar en unAccessibilityNodeInfo. La nueva claseAccessibilityNodeInfo.AccessibilityActionreemplaza las APIs relacionadas con las acciones que antes se encontraban enAccessibilityNodeInfo. - Android 5.0 proporciona un control más detallado sobre la síntesis de texto a voz en tu app. La nueva clase
Voicepermite que tu app use perfiles de voz asociados con configuraciones regionales específicas, calificaciones de calidad y latencia, y parámetros específicos del motor de texto a voz.
IME
Cambio más sencillo entre idiomas de entrada
A partir de Android 5.0, los usuarios pueden cambiar entre todos los editores de método de entrada (IME) compatibles con la plataforma. Cuando se realiza la acción de cambio designada (por lo general, tocar un ícono de globo terráqueo en el teclado en pantalla), se recorren todos esos IME. Este cambio de comportamiento se implementa con el método shouldOfferSwitchingToNextInputMethod().
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 un IME sin uno. Este cambio en el comportamiento se implementa con el método switchToNextInputMethod().
Para ver un ejemplo de cómo usar las APIs de cambio de IME actualizadas, consulta la muestra de implementación del teclado en pantalla actualizada 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 del manifiesto
Funciones obligatorias declarables
Ahora se admiten los siguientes valores en el elemento <uses-feature>, por lo que puedes asegurarte de que tu app se instale solo en dispositivos que proporcionen las funciones que necesita.
FEATURE_AUDIO_OUTPUTFEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSINGFEATURE_CAMERA_CAPABILITY_MANUAL_SENSORFEATURE_CAMERA_CAPABILITY_RAWFEATURE_CAMERA_LEVEL_FULLFEATURE_GAMEPADFEATURE_LIVE_TVFEATURE_MANAGED_USERSFEATURE_LEANBACKFEATURE_OPENGLES_EXTENSION_PACKFEATURE_SECURELY_REMOVES_USERSFEATURE_SENSOR_AMBIENT_TEMPERATUREFEATURE_SENSOR_HEART_RATE_ECGFEATURE_SENSOR_RELATIVE_HUMIDITYFEATURE_VERIFIED_BOOTFEATURE_WEBVIEW
Permisos de usuario
Ahora, se admite el siguiente permiso en el elemento <uses-permission> para declarar los permisos que requiere tu app para acceder a ciertas APIs.
BIND_DREAM_SERVICE: Cuando se orienta al nivel de API 21 y versiones posteriores, un servicio de Daydream requiere este permiso para garantizar que solo el sistema pueda vincularse a él.