API de Android 5.0

Nivel de API: 21

Android 5.0 (LOLLIPOP) ofrece nuevas funciones para los usuarios y desarrolladores de apps. En este documento, se brinda una introducción a las APIs nuevas más distinguidas.

Si publicaste una app, asegúrate de consultar los Cambios de comportamiento en Android 5.0 que debes tener en cuenta en tu app. Estos cambios en el comportamiento pueden afectar tu app en dispositivos con Android 5.0, incluso si no usas nuevas APIs o tienes como objetivo una nueva funcionalidad.

Para obtener una visión de alto nivel de las nuevas funciones de la plataforma, consulta la Android Lollipop destacados.

Empezar a programar

Para comenzar a compilar apps para Android 5.0, primero debes obtener el SDK de Android. Luego, usa 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

Para optimizar mejor tu app para dispositivos con Android 5.0, haz lo siguiente: establece tu targetSdkVersion en "21", instala tu app en un dispositivo Android 5.0, pruébala y publica la app actualizada con este cambio.

Puedes usar las APIs de Android 5.0 y, al mismo tiempo, mantener la compatibilidad con versiones anteriores agregando a tu código condiciones que comprueben el nivel de API del sistema antes de ejecutar las APIs no admitidas por tu minSdkVersion. Para obtener más información sobre cómo mantener la retrocompatibilidad, consulta Compatibilidad Diferentes versiones de la plataforma.

Para obtener más información sobre el funcionamiento de los niveles de API, consulta ¿Qué es un 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 aplicaciones con Material Design que sean visualmente dinámicas y tener transiciones de elementos de la IU que se sienten 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 funcionalidad de material design a tu aplicación, consulta Material Design

Documentos y actividades concurrentes en la pantalla de recientes

En 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 obtener actividades simultáneas de documentos. Esta función facilita la realización de varias tareas a la vez al lo que permite a los usuarios cambiar rápidamente entre actividades y documentos la pantalla Recientes, con una experiencia de cambio coherente entre todas las apps. Algunos ejemplos de estas tareas concurrentes pueden incluir pestañas abiertas en una app de navegador web, documentos en una app de productividad, partidas simultáneas en un juego o conversaciones 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 a 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 la saturación de 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> en 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, llamando al método setTaskDescription().

Actualizaciones de WebView

En Android 5.0, se actualiza WebView. en Chromium M37, que incorpora mejoras de seguridad y estabilidad, y la corrección de errores. La cadena usuario-agente predeterminada para un WebView que se ejecuta en Android 5.0 tiene para 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 permisos de Android para estos recursos con el fin de otorgar los permisos a la 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 ofrece compatibilidad con los WebAudio, WebGL y Estándares abiertos de 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 funcionalidad 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 tu app puede enviar a través de la red. La API solo permite capturar contenido de pantalla no seguro, y no audio del sistema. Para iniciar la captura de pantalla, tu app primero debe solicitar el permiso del usuario abriendo un cuadro de diálogo de captura de pantalla mediante un Intent obtenido a través de createScreenCaptureIntent() .

Para ver un ejemplo de cómo usar las nuevas APIs, consulta la clase MediaProjectionDemo en el proyecto de ejemplo.

Notificaciones

Notificaciones en la pantalla bloqueada

Las pantallas bloqueadas en Android 5.0 tienen la capacidad de mostrar notificaciones. Los usuarios pueden elegir a través de Configuración si desean permitir que el contenido de notificación confidencial se muestre en una pantalla de bloqueo segura.

Tu app puede controlar el nivel de detalle visible cuando sus notificaciones son que se muestra en la pantalla de bloqueo segura. Para controlar el nivel de visibilidad, llama a setVisibility() y especifica uno de los siguientes valores:

  • VISIBILITY_PRIVATE: Muestra información básica, como el ícono de la notificación, pero oculta todo el contenido de la notificación.
  • VISIBILITY_PUBLIC Muestra todo el contenido de la notificación.
  • VISIBILITY_SECRET: No muestra nada, incluso excluye 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 oculta 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 mensaje el contenido y los remitentes. Para proporcionar esta notificación alternativa, primero crea el notificación de reemplazo con Notification.Builder. Cuándo crea el objeto de notificación privada y adjunta la notificación de reemplazo a través de la setPublicVersion().

Metadatos de notificaciones

Android 5.0 usa metadatos asociados con notificaciones de tu app para ordenar las notificaciones de manera más inteligente. Para definir los metadatos, llama al los siguientes métodos en Notification.Builder cuando construye la notificación:

  • setCategory(): Le indica al sistema cómo controlar las notificaciones de tu app cuando la el dispositivo está en modo de prioridad (por ejemplo, si una notificación representa un llamada entrante, mensaje instantáneo o alarma).
  • setPriority(): Marca la notificación como más o menos importante que las notificaciones habituales. Las notificaciones con el campo de prioridad establecido en PRIORITY_MAX o PRIORITY_HIGH aparecen en una ventana flotante pequeña 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 esto para indicarle al sistema que debe agruparse notificaciones de las personas especificadas o clasifica las notificaciones de estas personas son 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 Java para OpenGL ES 3.1 en Android se proporciona con GLES31 Al usar OpenGL ES 3.1, asegúrate de declararla en tu archivo de manifiesto con el 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 que admite 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 ofrece un paquete de extensiones con interfaces Java y compatibilidad nativa con la funcionalidad de gráficos avanzados. En Android, estas extensiones se tratan como un único paquete. (Si la extensión ANDROID_extension_pack_es31a está presente, tu app puede suponer que están presentes todas las extensiones del paquete y habilitar las funciones del lenguaje de sombreado con una sola instrucción #extension).

El paquete de extensiones admite lo siguiente:

  • Compatibilidad con sombreador de fragmento 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 de Java para el paquete de extensiones se proporciona con GLES31Ext En el manifiesto de tu app, puedes declarar que esta debe instalarse únicamente en dispositivos compatibles con 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 más refinados de imágenes. Ahora puedes acceder mediante programación 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. El CameraCaptureSession se puede configurar para tomar fotos individuales o múltiples en ráfaga.

Para recibir notificaciones cuando se capturen imágenes nuevas, implementa el detector CameraCaptureSession.CaptureCallback y configúralo en tu solicitud de captura. Cuando el sistema complete la imagen, solicitud de captura, tu CameraCaptureSession.CaptureCallback el objeto de escucha recibe una llamada a onCaptureCompleted(): y te proporciona los metadatos de captura de imágenes CaptureResult

La clase CameraCharacteristics permite que tu app detecte las funciones de cámara disponibles en un dispositivo. El nombre del objeto La propiedad INFO_SUPPORTED_HARDWARE_LEVEL representa el nivel de funcionalidad de la cámara.

  • Todos los dispositivos admiten al menos Nivel de hardware de INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, que tiene capacidades que es aproximadamente equivalente al de la función Camera, que dejó de estar disponible. API de gcloud.
  • Los dispositivos que admiten el nivel de hardware INFO_SUPPORTED_HARDWARE_LEVEL_FULL permiten el control manual de la captura y el procesamiento posterior, así como la captura de imágenes de alta resolución a altos índices de fotogramas.

Para ver cómo usar la API actualizada de Camera, 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

  • Tu app ahora puede suministrar datos de audio en formato de punto flotante (ENCODING_PCM_FLOAT). Esto permite obtener un rango dinámico más amplio, una precisión más uniforme y una capacidad de aumento mayor. 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, partes de la canalización interna todavía no están punto flotante).
  • Tu app ahora puede proporcionar datos de audio como un ByteBuffer, en el mismo formato que proporciona MediaCodec.
  • La opción WRITE_NON_BLOCKING puede simplificar el almacenamiento en búfer y la ejecución de varios subprocesos para algunas apps.

Control de reproducción de medios

Usa las nuevas APIs de notificación y medios para asegurarte de que la IU del sistema esté al tanto de tu reproducción de medios, y de que pueda extraer y mostrar la carátula del álbum. Con el nuevo modo, ahora es más fácil controlar la reproducción de contenido multimedia en una IU y un servicio MediaSession y MediaController de clases.

La nueva clase MediaSession reemplaza la clase RemoteControlClient obsoleta y proporciona un un único conjunto de métodos de devolución de llamada para controlar los controles de transporte y los botones multimedia. Si tu app ofrece reproducción de contenido multimedia y se ejecuta en las plataformas 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 crear tu propia app de controlador multimedia con el nuevo Clase MediaController. Esta clase proporciona una forma segura para subprocesos de supervisar y controlar la reproducción de contenido multimedia desde el proceso de IU de tu app. Cuando crees un controlador, especifica un MediaSession.Token de modo que tu app pueda interactuar con el objeto 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 control, también puedes registra un objeto MediaController.Callback para detectar metadatos y cambios de estado en la sesión.

Además, puedes crear notificaciones enriquecidas que permitan el control de la 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 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 de multimedia en la app, extiende la clase MediaBrowserService. Tu implementación de MediaBrowserService debe brindar 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 de medios, 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 amplía el framework de acceso a almacenamiento para permitir que los usuarios seleccionen un subárbol de directorio entero y proporcionar a las apps acceso de lectura y escritura a todos los documentos contenidos sin requerir la confirmación del usuario para cada uno de ellos.

Para seleccionar un subárbol de directorio, crea y envía un intent OPEN_DOCUMENT_TREE. El sistema muestra todas las instancias de DocumentsProvider que admiten la selección de subárboles. Esto permite que el usuario explore y seleccione un directorio. El URI devuelto representa acceso al subárbol seleccionado. Luego, podrás 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. en el subárbol. Para administrar los documentos existentes, usa renameDocument() y deleteDocument() Revisa COLUMN_FLAGS para verificar la compatibilidad del proveedor con estas llamadas antes de emitirlas.

Si implementas un DocumentsProvider y deseas admitir la selección de un subárbol, 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 almacenamiento compartido en el que tu app puede colocar archivos multimedia para incluirlos MediaStore La nueva herramienta getExternalMediaDirs() muestra rutas de acceso a estas directorios en todos los dispositivos de almacenamiento compartido. De manera similar a getExternalFilesDir(), la app no necesita permisos adicionales para acceder a las rutas de acceso mostradas. La plataforma busca periódicamente nuevos medios en estos directorios, pero también puedes usar MediaScannerConnection para buscar contenido nuevo de forma explícita.

Inalámbrico y Conectividad

Conexiones de red múltiples

Android 5.0 ofrece nuevas APIs de redes múltiples que permiten buscar de forma dinámica las redes disponibles con capacidades específicas y establecer una conexión con ellos. 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 particular de protocolo de transporte.

Para seleccionar una red y conectarte a ella de forma dinámica desde tu app, sigue estos pasos: pasos:

  1. Crea un elemento ConnectivityManager.
  2. Usa la clase NetworkRequest.Builder para crear un NetworkRequest y especifica las características de red y el tipo de transporte que le interesa a tu app.
  3. Para buscar redes adecuadas, llama a requestNetwork() o registerNetworkCallback(), y pasa el NetworkRequest y una implementación de ConnectivityManager.NetworkCallback Usa el método requestNetwork() si deseas cambiar de forma activa a una red adecuada una vez que se haya detectado. Para recibir solo notificaciones de redes analizadas sin realizar cambios de forma activa, usa el método registerNetworkCallback().

Cuando el sistema detecta una red adecuada, se conecta a la red e invoca la devolución de llamada onAvailable(). Puedes usar el objeto Network desde la devolución de llamada para obtener información adicional sobre la red o dirigir el tráfico para 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 que actúe como un dispositivo periférico Bluetooth LE. Las apps pueden usar esta función para que otros dispositivos cercanos detecten su presencia. Por ejemplo, puedes crear apps que permiten que un dispositivo funcione como un podómetro o un monitor de salud y se 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 LE cercanos. Para usar las nuevas funciones de publicidad y análisis, agrega lo siguiente: BLUETOOTH_ADMIN permiso en tu manifiesto. Cuando los usuarios actualizan o descargan tu app desde Play Store, se les pide que concedan el siguiente permiso a tu 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".

Para comenzar la publicidad a través de Bluetooth LE para que otros dispositivos puedan descubrir tu app, llama a startAdvertising() y envía 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 publicitaria.

En Android 5.0, se introduce la clase ScanFilter para que tu app pueda buscar solo los tipos específicos de dispositivos que le interesan. Para empezar a buscar dispositivos Bluetooth LE, llama a startScan() y pasa una lista de filtros. En la llamada al 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 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 puedes hacer lo siguiente: registrar un ID de aplicación NFC (AID) de forma dinámica llamando registerAidsForService() También puedes usar setPreferredService() 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 hace hincapié en las mejoras de la duración de la batería. Usa las nuevas APIs y la herramienta para entender y optimizar el consumo de energía de tu app.

Programación de trabajos

Android 5.0 proporciona un nuevo elemento JobScheduler. API que permite optimizar la duración de batería definiendo los trabajos que ejecutará el sistema de forma asíncrona más adelante o en condiciones específicas (por ejemplo, cuando la 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 cuando la unidad esté enchufada.
  • La app tiene una tarea que requiere acceso a la red o una conexión Wi-Fi. conexión.
  • La app tiene varias tareas que deseas que se ejecuten por lote en un tiempo programado regular.

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 la manera en que debe ejecutarse la tarea programada. Puedes programar la tarea para que se ejecute condiciones, como las que se mencionan a continuación:

  • 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 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 energía estable (es decir, se conectó por más tiempo) de 2 minutos y que la batería esté en un nivel saludable), el sistema ejecutará cualquier trabajo programado que esté listo para ejecutarse, incluso si el no haya vencido la fecha límite.

Para ver un ejemplo de cómo usar la API de JobScheduler, consulta el ejemplo de implementación de JobSchedulerSample en esta versión.

Herramientas de desarrolladores para el uso de batería

El nuevo comando dumpsys batterystats genera un datos estadísticos sobre el uso de la 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
  • 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 obtener información acerca de las distintas opciones para adaptar la salida. Por ejemplo, para imprimir el uso de batería estadísticas para un paquete de app determinado desde la última vez que se cargó el dispositivo, ejecuta este :

$ adb shell dumpsys batterystats --charged <package-name>

Puedes usar la herramienta Battery Historian en la salida del comando dumpsys para generar una visualización HTML de eventos relacionados con la energí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 ofrece nuevas funcionalidades para ejecutar apps en un entorno empresarial. R administrador de dispositivos pueden iniciar un proceso de aprovisionamiento administrado el perfil administrado a un dispositivo, si el usuario ya tiene una cuenta personal. Las apps que se asocian con perfiles administrados aparecen junto a las apps no administradas en el Launcher del usuario, la pantalla de recientes y las notificaciones.

Para iniciar el proceso de aprovisionamiento administrado, envía ACTION_PROVISION_MANAGED_PROFILE en un objeto Intent. Si el botón se realiza correctamente, el sistema activa 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 Selector, puedes usar la nueva clase LauncherApps para obtener una lista de actividades que se pueden iniciar para el usuario actual y cualquier perfil administrado asociado. Tu Launcher puede hacer que las apps administradas se destaquen visualmente agregando una insignia de trabajo al ícono del elemento de diseño. Para recuperar el ícono con distintivo, 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 configurar opciones globales en el dispositivo. La app del propietario del dispositivo puede usar la métodos de la clase DevicePolicyManager para que tomen 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 De una app de programación al dispositivo mientras este no está aprovisionado para cada estado. Esta transferencia de datos envía la misma información que la que se envía en el intent de aprovisionamiento como se describe en Aprovisionamiento administrado

Fijar pantalla

Android 5.0 introduce una nueva API de fijación de pantalla que te permite impedir temporalmente que los usuarios abandonen tu tarea o sean interrumpidos por notificaciones. Podría usarse, por ejemplo, si programas una app de educación para cumplir con requisitos de evaluación de gran importancia en Android, o una aplicación de propósito único 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 desees para fijarlo. Para ello, toca el ícono de marcador verde en la pantalla 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 solicita confirmación al usuario. Una app del propietario del dispositivo puede llamar al setLockTaskPackages() método para permitir que las aplicaciones se puedan fijar sin el paso de la confirmación del usuario.

Cuando el bloqueo de tareas está activo, ocurre lo siguiente:

  • La barra de estado está en blanco, y las notificaciones y la información de estado del usuario oculto.
  • 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 lo haga crear tareas nuevas.
  • Cuando un propietario de dispositivo invoca la fijación de pantalla, el usuario no puede acceder a tu app hasta que esta llame a stopLockTask().
  • Si la fijación de pantalla se activa a través de otra app que no sea un propietario de dispositivo o a través del usuario directamente, el usuario puede salir de ella manteniendo presionados los botones de Atrás y Recientes.

Framework de impresión

Representación de PDF como mapa de bits

Ahora puedes representar páginas de documentos PDF en imágenes de mapa de bits para imprimir usando la nueva clase PdfRenderer. Debes especificar un ParcelFileDescriptor que se puede buscar (es decir, el contenido se puede acceder de forma aleatoria) en los que el sistema escribe el contenido imprimible. Tu app puede obtener una página para renderizar con openPage() y, luego, llama render() para convertir el PdfRenderer.Page abierto en un mapa de bits. También puedes configurar parámetros adicionales si solo deseas convertir una parte del documento en una imagen de mapa de bits (por ejemplo, para implementar la representación de mosaicos con el propósito de 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 desde un dispositivo Android con la nueva API de android.app.usage. Esta API proporciona un uso más detallado información que la versión obsoleta getRecentTasks(). Para usar esta API, primero debes declarar el "android.permission.PACKAGE_USAGE_STATS" en tu manifiesto. El usuario también debe habilitar el acceso a esta app en Configuración > Seguridad > Aplicaciones con acceso a datos de uso.

El sistema recopila los datos de uso por app y agrega datos 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;
  • 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 trasladan al primer o segundo plano durante un día
  • Captura de marca de tiempo del momento en que se modificó la configuración de un dispositivo (por ejemplo, cuando la orientación del dispositivo cambió debido a la rotación)

Pruebas y Accesibilidad

Mejoras de pruebas y accesibilidad

Android 5.0 incorpora la siguiente compatibilidad para pruebas y accesibilidad:

  • El nuevo getWindowAnimationFrameStats() y getWindowContentFrameStats(). capturan estadísticas de fotogramas para animaciones de ventanas y contenido. Estos métodos permiten escribir pruebas de instrumentación para evaluar si una app representa fotogramas a una frecuencia de actualización suficiente que brinde una experiencia de usuario fluida.
  • La nueva herramienta executeShellCommand() te permite ejecutar comandos de shell desde tu prueba de instrumentación. La ejecución de comandos es similar a la ejecución de adb shell desde un host conectado al dispositivo, lo que te permite usar herramientas basadas en shell, como dumpsys, am, content y pm.
  • 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 objetos AccessibilityWindowInfo, llama al nuevo método getWindows().
  • El nuevo AccessibilityNodeInfo.AccessibilityAction te permite definir acciones estándar o personalizadas para realizar en una AccessibilityNodeInfo El nuevo AccessibilityNodeInfo.AccessibilityAction reemplaza a las APIs relacionadas con acciones que se encontraban previamente en AccessibilityNodeInfo
  • Android 5.0 ofrece un control más refinado 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, calificaciones de calidad y latencia, y parámetros específicos del motor de conversión 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étodos de entrada (IME) compatibles con la plataforma. Realizar las tareas ciclos de acción de cambio (por lo general, tocar un ícono de globo terráqueo en el teclado en pantalla) a través de todos esos IME. A este cambio de comportamiento lo implementa el shouldOfferSwitchingToNextInputMethod() .

Además, el framework ahora comprueba si el siguiente IME incluye un mecanismo de cambio (y, por lo tanto, si ese IME admite el cambio al IME que le sigue). Los Un IME con un mecanismo de cambio no pasará a un IME que no lo tenga. Este cambio de comportamiento se implementa a través del método switchToNextInputMethod().

Para ver un ejemplo de cómo usar las APIs de cambio de IME actualizadas, consulta el caso de implementación de teclado en pantalla actualizado en esta versión. Para obtener más información sobre cómo implementar el cambio entre IME, consulta Cómo crear un método de entrada.

Declaraciones de manifiesto

Funciones requeridas declarables

Ahora se admiten los siguientes valores en el <uses-feature> para garantizar que tu app se instale solo en dispositivos que proporcionar las funciones que tu app necesita.

Permisos del usuario

Ahora se admite el siguiente permiso <uses-permission> para declarar los permisos que requiere tu app para acceder a determinadas APIs.

  • BIND_DREAM_SERVICE: Cuando se tiene como destino un nivel de API 21 o superior, este permiso es requerido por un servicio de Daydream para garantizar que solo el sistema pueda vincularse a él.