API de Android 6.0

Android 6.0 (M) ofrece nuevas funciones para los usuarios y desarrolladores de apps. En este documento, se proporciona una introducción sobre las APIs más destacadas.

Iniciar el desarrollo

A fin de comenzar a compilar apps para Android 6.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 6.0.

Actualiza el nivel de tu API de destino

A fin de optimizar mejor tu app para los dispositivos que ejecutan Android, establece targetSdkVersion en "23", instala la app en una imagen del sistema Android, pruébala y, luego, publica la app actualizada con este cambio.

Puedes usar las APIs de Android y, al mismo tiempo, admitir versiones anteriores. Para ello, agrega condiciones a tu código que verifiquen el nivel de API del sistema antes de ejecutar APIs no compatibles con tu minSdkVersion. Para 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 el funcionamiento de los niveles de API, consulta ¿Qué es un nivel de API?

Autenticación por huellas dactilares

En esta versión, se ofrecen nuevas APIs que te permiten autenticar a los usuarios mediante el escaneo de huella dactilar en dispositivos compatibles. Usa estas APIs junto con el sistema Android Keystore.

Para autenticar usuarios mediante el escaneo de huella digital, obtén una instancia de la nueva clase FingerprintManager y llama al método authenticate(). Tu app se debe ejecutar en un dispositivo compatible con un sensor de huellas dactilares. Debes implementar la interfaz de usuario para el flujo de autenticación con huella digital en tu app y usar el ícono de huella digital estándar de Android en tu IU. El ícono de huella digital de Android (c_fp_40px.png) se incluye en la muestra de autenticación biométrica. Si desarrollas varias apps que usan autenticación con huella digital, ten en cuenta que cada una de ellas debe autenticar la huella dactilar del usuario de manera independiente.

Para usar esta función en tu app, primero agrega el permiso USE_FINGERPRINT en tu manifiesto.

<uses-permission
        android:name="android.permission.USE_FINGERPRINT" />
Dispositivo móvil que muestra la funcionalidad de autenticación con huella digital

Para ver cómo una app implementa la autenticación con huella digital, consulta la muestra de autenticación biométrica. Para ver una demostración de cómo puedes usar estas APIs de autenticación junto con otras APIs de Android, mira el video APIs de huella dactilar y pago.

Si estás evaluando esta función, sigue estos pasos:

  1. Instala la Revisión de herramientas de Android SDK versión 24.3 si todavía no lo hiciste.
  2. Inscribe una huella digital nueva en el emulador. Para ello, ve a Settings > Security > Huella digital y, luego, sigue las instrucciones de inscripción.
  3. Usa un emulador para emular eventos táctiles de huellas dactilares con el siguiente comando. Usa el mismo comando para emular eventos táctiles de huellas dactilares en la pantalla de bloqueo o en tu app.
    adb -e emu finger touch <finger_id>
    

    En Windows, es posible que debas ejecutar telnet 127.0.0.1 <emulator-id> seguido de finger touch <finger_id>.

Confirmar credencial

Tu app puede autenticar usuarios según el tiempo que haya pasado desde que desbloquearon el dispositivo por última vez. Esta función evita que los usuarios tengan que recordar contraseñas adicionales específicas de la app y evita la necesidad de que implementes tu propia interfaz de usuario de autenticación. Tu app debe usar esta función junto con una implementación de clave pública o secreta para la autenticación del usuario.

Para establecer el tiempo de espera en el que se puede volver a usar la misma clave después de que un usuario se autentique de forma correcta, llama al nuevo método setUserAuthenticationValidityDurationSeconds() cuando configures KeyGenerator o KeyPairGenerator.

Evita mostrar el diálogo de reautenticación de manera excesiva: tus apps deben intentar usar el objeto criptográfico primero y, si se agota el tiempo de espera, deben usar el método createConfirmDeviceCredentialIntent() para volver a autenticar al usuario dentro de tu app.

Vinculación de app

Esta versión mejora el sistema de intents de Android mediante vínculos de app más potentes. Esta función te permite asociar una app con un dominio web propio. En función de esta asociación, la plataforma puede determinar la app predeterminada que se usará para controlar un vínculo web en particular y omitir el paso de solicitar a los usuarios que seleccionen una app. Para obtener información sobre cómo implementar esta función, consulta Cómo controlar los vínculos de una app.

Auto Backup for Apps

Ahora, el sistema realiza restauraciones y copias de seguridad de datos completas y automáticas para las apps. Tu app debe orientarse a Android 6.0 (nivel de API 23) para habilitar este comportamiento; no es necesario que agregues ningún código adicional. Si los usuarios borran sus cuentas de Google, también se eliminarán sus datos de copias de seguridad. Para obtener información sobre cómo funciona esta función y cómo configurar de qué elementos se debe crear una copia de seguridad en el sistema de archivos, consulta Cómo configurar la copia de seguridad automática para apps.

Direct Share

Parte inferior de un dispositivo móvil que muestra la función Compartir directo

Esta versión te proporciona API para que los usuarios puedan compartir contenido de manera rápida e intuitiva. Ahora puedes definir objetivos de uso compartido directo que inician una actividad específica en tu app. Estos objetivos de uso compartido directo se exponen a los usuarios a través del menú Compartir. Esta función permite que los usuarios compartan contenido con los destinos, como contactos, dentro de otras apps. Por ejemplo, el objetivo de uso compartido directo podría iniciar una actividad en otra app de red social, lo que le permite al usuario compartir contenido directamente con un amigo o una comunidad específicos de esa app.

Para habilitar los objetivos de uso compartido directo, debes definir una clase que extienda la clase ChooserTargetService. Declara tu servicio en el manifiesto. Dentro de esa declaración, especifica el permiso BIND_CHOOSER_TARGET_SERVICE y un filtro de intents con la acción SERVICE_INTERFACE.

En el siguiente ejemplo, se muestra cómo podrías declarar el ChooserTargetService en tu manifiesto.

<service android:name=".ChooserTargetService"
        android:label="@string/service_name"
        android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
    <intent-filter>
        <action android:name="android.service.chooser.ChooserTargetService" />
    </intent-filter>
</service>

Para cada actividad que desees exponer a ChooserTargetService, agrega un elemento <meta-data> con el nombre "android.service.chooser.chooser_target_service" en el manifiesto de tu app.

<activity android:name=".MyShareActivity”
        android:label="@string/share_activity_label">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
    </intent-filter>
<meta-data
        android:name="android.service.chooser.chooser_target_service"
        android:value=".ChooserTargetService" />
</activity>

Interacciones de voz

Esta versión proporciona una nueva API de interacción de voz que, junto con las Acciones de voz, te permite compilar experiencias de voz conversacional en tus apps. Llama al método isVoiceInteraction() para determinar si una acción de voz activó tu actividad. Si es así, tu app puede usar la clase VoiceInteractor para solicitar una confirmación de voz del usuario, seleccionar opciones de una lista y mucho más.

La mayoría de las interacciones de voz se originan a partir de la acción de voz de un usuario. Sin embargo, una actividad de interacción de voz también puede iniciarse sin la entrada del usuario. Por ejemplo, otra app iniciada mediante una interacción de voz también puede enviar un intent para iniciar una interacción de voz. Para determinar si tu actividad se inició a partir de una consulta por voz del usuario o de otra app de interacción por voz, llama al método isVoiceInteractionRoot(). Si otra app inició tu actividad, el método muestra false. Luego, tu app puede solicitarle al usuario que confirme si esta acción era la deseada.

Para obtener más información sobre cómo implementar acciones de voz, consulta el sitio para desarrolladores de Acciones de voz.

Assist API

Esta versión ofrece a los usuarios una nueva manera de interactuar con tus apps a través de un asistente. Si quieres utilizar esta función, el usuario debe habilitar el Asistente para usar el contexto actual. Una vez habilitado, para invocar al Asistente dentro de cualquier app, el usuario debe mantener presionado el botón de inicio.

Tu app puede elegir no compartir el contexto actual con Asistente estableciendo la marca FLAG_SECURE. Además del conjunto estándar de información que la plataforma pasa al Asistente, tu app puede compartir información adicional con la nueva clase AssistContent.

Para proporcionar al asistente contexto adicional desde tu app, sigue estos pasos:

  1. Implementa la interfaz de Application.OnProvideAssistDataListener.
  2. Registra este objeto de escucha con registerOnProvideAssistDataListener().
  3. Para proporcionar información contextual específica de la actividad, anula la devolución de llamada onProvideAssistData() y, de manera opcional, la nueva devolución de llamada onProvideAssistContent().

Dispositivos de almacenamiento adoptables

Con esta versión, los usuarios pueden adoptar dispositivos de almacenamiento externo, como tarjetas SD. Cuando adoptas un dispositivo de almacenamiento externo, el dispositivo se encripta y se formatea para que funcione como un almacenamiento interno. Esta función permite a los usuarios mover tanto las apps como los datos privados de esas apps entre dispositivos de almacenamiento. Al mover apps, el sistema respeta la preferencia android:installLocation del manifiesto.

Si tu app accede a las siguientes APIs o campos, ten en cuenta que las rutas de acceso a los archivos que muestran cambiarán de forma dinámica cuando la app se mueva entre dispositivos de almacenamiento interno y externo. Al compilar rutas de acceso a archivos, se recomienda enormemente que llames siempre a estas API de forma dinámica. No uses rutas de acceso a archivos codificadas ni continúes usando rutas de acceso a archivos completamente calificadas que se hayan compilado anteriormente.

Para depurar esta función, puedes habilitar la adopción de una unidad USB que esté conectada a un dispositivo Android mediante un cable USB On-The-Go (OTG). Para ello, ejecuta el siguiente comando:

$ adb shell sm set-force-adoptable true

Notificaciones

En esta versión se agregan los siguientes cambios de API para las notificaciones:

Compatibilidad con la pluma stylus Bluetooth

Esta versión ofrece una mejor compatibilidad con entradas de usuario realizadas con una pluma stylus Bluetooth. Los usuarios pueden vincular y conectar una pluma stylus Bluetooth compatible con su teléfono o tablet. Cuando está conectado, la información de posición de la pantalla táctil se fusiona con la información de los botones y la presión de la pluma stylus para proporcionar una mayor variedad de expresiones que si solo se utiliza la pantalla táctil. Tu app puede escuchar cuando se presiona el botón de la pluma stylus y realizar acciones secundarias registrando los objetos View.OnContextClickListener y GestureDetector.OnContextClickListener en tu actividad.

Usa las constantes y los métodos MotionEvent para detectar las interacciones del botón de la pluma stylus:

Exploración mejorada de Bluetooth de bajo consumo

Si tu app realiza escaneos de Bluetooth de bajo consumo, usa el nuevo método setCallbackType() para especificar que deseas que el sistema notifique devoluciones de llamada cuando encuentre por primera vez un paquete de publicidad que coincida con el conjunto ScanFilter o cuando lo vea después de un largo tiempo. Este enfoque de búsqueda es más eficaz en términos de consumo de energía que el que se proporciona en la versión anterior de la plataforma.

Compatibilidad con Hotspot 2.0 versión 1

Esta versión agrega compatibilidad para la especificación de Hotspot 2.0 versión 1 en los dispositivos Nexus 6 y Nexus 9. Para aprovisionar credenciales de Hotspot 2.0 en tu app, usa los métodos nuevos de la clase WifiEnterpriseConfig, como setPlmn() y setRealm(). En el objeto WifiConfiguration, puedes configurar los campos FQDN y providerFriendlyName. El nuevo método isPasspointNetwork() indica si una red detectada representa un punto de acceso de Hotspot 2.0.

Modo de pantalla 4K

La plataforma ahora permite que las apps soliciten que la resolución de pantalla se actualice a una renderización 4K en hardware compatible. Para consultar la resolución física actual, usa las nuevas APIs de Display.Mode. Si la IU se dibuja en una resolución lógica más baja y se aumenta a una resolución física mayor, ten en cuenta que la resolución física que muestra el método getPhysicalWidth() puede diferir de la resolución lógica informada por getSize().

Puedes solicitar al sistema que cambie la resolución física de tu app mientras se ejecuta. Para ello, configura la propiedad preferredDisplayModeId de la ventana de tu app. Esta función resulta útil si deseas aplicar un cambio a la resolución de pantalla 4K. En el modo de pantalla 4K, la IU se sigue renderizando en la resolución original (como 1080p) y se aumenta a 4K, pero los objetos SurfaceView pueden mostrar contenido en la resolución nativa.

ColorStateLists para poder aplicar temas

Los atributos de tema ahora son compatibles con ColorStateList para dispositivos que ejecutan Android 6.0 (nivel de API 23). Los métodos Resources.getColorStateList() y Resources.getColor() dejaron de estar disponibles. Si llamas a estas APIs, llama a los nuevos métodos Context.getColorStateList() o Context.getColor() en su lugar. Estos métodos también están disponibles en la biblioteca appcompat v4 a través de ContextCompat.

Características de audio

En esta versión se agregan mejoras al procesamiento de audio en Android. Se incluye lo siguiente:

  • Compatibilidad con el protocolo MIDI, con las nuevas APIs de android.media.midi. Usa estas APIs para enviar y recibir eventos MIDI.
  • Se agregaron nuevas clases AudioRecord.Builder y AudioTrack.Builder para crear capturas de audio digital y objetos de reproducción respectivamente, y configurar propiedades de receptores y fuentes de audio para anular los valores predeterminados del sistema.
  • Enlaces de API para asociar dispositivos de entrada y de audio. Esto es particularmente útil si tu app permite a los usuarios iniciar una búsqueda por voz desde un control para juegos o un control remoto conectados a Android TV. El sistema invoca la nueva devolución de llamada onSearchRequested() cuando el usuario inicia una búsqueda. Para determinar si el dispositivo de entrada del usuario tiene un micrófono integrado, recupera el objeto InputDevice de esa devolución de llamada y, luego, llama al nuevo método hasMicrophone().
  • Se agregó un nuevo método getDevices(), que permite recuperar una lista de todos los dispositivos de audio conectados al sistema en ese momento. También puedes registrar un objeto AudioDeviceCallback si deseas que el sistema notifique a tu app cuando se conecte o desconecte un dispositivo de audio.

Características de video

En esta versión se agregan nuevas capacidades a las API de procesamiento de video, como las siguientes:

  • Nueva clase MediaSync que ayuda a las aplicaciones a renderizar de forma síncrona transmisiones de audio y video. Los búferes de audio se envían de manera no bloqueadora y se muestran mediante una devolución de llamada. Además, se admite una velocidad de reproducción dinámica.
  • Nuevo evento EVENT_SESSION_RECLAIMED, que indica que una sesión que abrió la app fue reclamada por el administrador de recursos. Si tu app usa sesiones DRM, debes controlar este evento y asegurarte de no usar una sesión reclamada.
  • Nuevo código de error ERROR_RECLAIMED, que indica que el administrador de recursos reclamó el recurso multimedia utilizado por el códec. Con esta excepción, se debe liberar el códec, ya que pasó al estado terminal.
  • Nueva interfaz getMaxSupportedInstances() para obtener una sugerencia de la cantidad máxima de instancias simultáneas de códecs admitidas
  • Nuevo método setPlaybackParams() para configurar la velocidad de reproducción de contenido multimedia para reproducciones rápidas o lentas. Además, alarga o acelera la reproducción de audio junto con el video automáticamente.

Funciones de la cámara

Esta versión incluye las siguientes APIs nuevas para acceder a la linterna y el reprocesamiento de imágenes de la cámara:

Flashlight API

Si un dispositivo de cámara tiene una unidad de flash, puedes llamar al método setTorchMode() para activar o desactivar el modo linterna de una unidad de flash sin abrir el dispositivo de cámara. La app no tiene propiedad exclusiva de la unidad de flash ni del dispositivo de cámara. El modo linterna se desactiva y deja de estar disponible cuando la cámara no se encuentra disponible o cuando otros recursos de la cámara que mantienen la linterna encendida dejan de estar disponibles. Otras apps también pueden llamar a setTorchMode() para desactivar el modo linterna. Cuando se cierra la última app que activó el modo linterna, este modo se desactiva.

Si deseas registrar una devolución de llamada para recibir una notificación sobre el estado del modo linterna, llama al método registerTorchCallback(). La primera vez que se registra la devolución de llamada, se llama inmediatamente con el estado del modo linterna de todos los dispositivos de cámara con unidad de flash que se conocen actualmente. Si el modo linterna se activa o desactiva correctamente, se invoca al método onTorchModeChanged().

Reprocessing API

La API de Camera2 se extiende para admitir el reprocesamiento de imágenes privadas de formato opaco y YUV. Para determinar si estas funciones de reprocesamiento están disponibles, llama a getCameraCharacteristics() y verifica la clave REPROCESS_MAX_CAPTURE_STALL. Si un dispositivo admite el reprocesamiento, puedes crear una sesión de captura de cámara reprocesable llamando a createReprocessableCaptureSession() y crear solicitudes para el reprocesamiento del búfer de entrada.

Usa la clase ImageWriter para conectar el flujo del búfer de entrada a la entrada de reprocesamiento de la cámara. Para obtener un búfer vacío, sigue el modelo de programación que se indica a continuación:

  1. Llama al método dequeueInputImage().
  2. Completa los datos en el búfer de entrada.
  3. Llama al método queueInputImage() para enviar el búfer a la cámara.

Si usas un objeto ImageWriter junto con una imagen PRIVATE, la app no podrá acceder a los datos de la imagen directamente. En su lugar, pasa la imagen PRIVATE directamente a ImageWriter llamando al método queueInputImage() sin ninguna copia del búfer.

La clase ImageReader ahora admite flujos de imágenes de formato PRIVATE. Esta compatibilidad permite que tu app mantenga una cola circular de imágenes de salida ImageReader, seleccione una o más imágenes y las envíe a ImageWriter para el reprocesamiento de la cámara.

Características de Android for Work

En esta versión se incluyen las siguientes API nuevas para Android for Work:

  • Controles mejorados para dispositivos corporativos de uso único: Ahora, el propietario del dispositivo puede controlar los siguientes parámetros de configuración para mejorar la administración de los dispositivos corporativos de uso único (COSU):
    • Inhabilita o vuelve a habilitar el bloqueo de seguridad con el método setKeyguardDisabled().
    • Inhabilita o vuelve a habilitar la barra de estado (lo que incluye la configuración rápida, las notificaciones y el gesto de navegación al deslizar el dedo hacia arriba para iniciar Google Now) con el método setStatusBarDisabled().
    • Inhabilita o vuelve a habilitar el inicio seguro con la constante DISALLOW_SAFE_BOOT de UserManager.
    • Evita que la pantalla se apague mientras el dispositivo está conectado con la constante STAY_ON_WHILE_PLUGGED_IN.
  • Instalación y desinstalación automáticas de apps por parte del propietario del dispositivo: Ahora el propietario del dispositivo puede instalar y desinstalar aplicaciones de manera silenciosa con las APIs de PackageInstaller, independientemente de Google Play for Work. Ahora, puedes aprovisionar los dispositivos a través de un propietario de dispositivo que recupera e instala apps sin interacción del usuario. Esta función es útil para habilitar el aprovisionamiento con un toque de kioscos o cualquier otro dispositivo similar sin activar una Cuenta de Google.
  • Acceso automático al certificado empresarial: Cuando una app llama a choosePrivateKeyAlias(), antes de que se le solicite al usuario que seleccione un certificado, el propietario del dispositivo o perfil ahora puede llamar al método onChoosePrivateKeyAlias() para proporcionar el alias de forma silenciosa a la aplicación solicitante. Esta función te permite otorgar a las apps administradas acceso a certificados sin interacción del usuario.
  • Aceptación automática de actualizaciones del sistema. Cuando configuras una política de actualización del sistema con setSystemUpdatePolicy(), el propietario de un dispositivo ahora puede aceptar automáticamente una actualización del sistema (por ejemplo, en el caso de un dispositivo de kiosco) o posponer la actualización y evitar que el usuario la ejecute durante un máximo de 30 días. Además, un administrador puede configurar un período diario en el que se debe ejecutar una actualización, por ejemplo, durante las horas en las que un dispositivo de kiosco no está en uso. Cuando hay una actualización del sistema disponible, el sistema verifica si la app del controlador de políticas del dispositivo estableció una política de actualización del sistema y se comporta según corresponda.
  • Instalación delegada de certificados: Ahora un propietario de dispositivo o perfil puede otorgar a una app de terceros la capacidad de llamar a estas APIs de administración de certificados DevicePolicyManager:
  • Dispositivo móvil que muestra la función de notificación del estado de trabajo en Android for Work
  • Seguimiento del uso de datos. Ahora, un propietario de dispositivo o perfil puede consultar las estadísticas de uso de datos visibles en Configuración > Uso de datos con los nuevos métodos NetworkStatsManager. A los propietarios de perfiles se les otorga permiso automáticamente para consultar datos en el perfil que administran, mientras que los propietarios de dispositivos obtienen acceso a los datos de uso del usuario principal administrado.
  • Administración de permisos de tiempo de ejecución:

    Un propietario de dispositivo o perfil puede configurar una política de permisos para todas las solicitudes de tiempo de ejecución de todas las aplicaciones mediante setPermissionPolicy() a fin de solicitarle al usuario que otorgue el permiso, o bien otorgar o rechazarlo automáticamente de forma silenciosa. Si estableces esta última política, el usuario no podrá modificar la selección realizada por el propietario del dispositivo o perfil en la pantalla de permisos de la app en Configuración.

  • VPN en Configuración: Ahora puedes ver las apps de VPN en Configuración > Más > VPN. Además, las notificaciones que acompañan al uso de la VPN ahora son específicas de la forma en que se configura esa VPN. Para el propietario del perfil, las notificaciones son específicas según si la VPN está configurada para un perfil administrado, un perfil personal o ambos. Para un propietario de dispositivo, las notificaciones son específicas según la VPN se configure para todo el dispositivo.
  • Notificación de estado del trabajo: Ahora aparece un ícono de maletín en la barra de estado cada vez que una app del perfil administrado tiene una actividad en primer plano. Además, si el dispositivo se desbloquea directamente para la actividad de una app en el perfil administrado, se mostrará un aviso que le notificará al usuario que se encuentra dentro del perfil de trabajo.