Android 6.0 API

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

Iniciar el desarrollo

A fin de comenzar a crear apps para Android 6.0, primero debes obtener Android SDK. Luego, debes usar SDK Manager para descargar las imágenes de 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 dispositivos con Android, fija tu 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 Android API 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 API no admitidas por el atributo minSdkVersion. Para obtener más información sobre cómo mantener la compatibilidad con versiones anteriores, consulta Compatibilidad con versiones de plataforma diferentes.

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 API que te permiten autenticar usuarios a través del escaneo de sus huellas dactilares en dispositivos compatibles. Usa estas API junto con el sistema Android Keystore.

Para autenticar usuarios mediante el escaneo de huellas dactilares, obtén una instancia de la nueva clase FingerprintManager y llama al método authenticate(). Tu app se debe usarse en un dispositivo compatible con un sensor de huellas digitales. Debes implementar la interfaz de usuario para el flujo de autenticación por huellas dactilares en tu app y usar el ícono de huella dactilar estándar de Android en la IU. El ícono de huella dactilar de Android (c_fp_40px.png) se incluye en el ejemplo de diálogo de huella dactilar. Si desarrollas varias apps en las que se usa autenticación por huellas dactilares, debes tener en cuenta que cada app 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" />

Para ver la manera en que una app implementa la autenticación por huellas dactilares, consulta el ejemplo de diálogo de huella dactilar. Para ver una demostración de la manera en que puedes usar estas API de autenticación con otras Android API, mira el video Fingerprint y Payment API.

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. Registra una huella dactilar nueva en el emulador; para hacerlo, ve a Settings > Security > Fingerprint y luego sigue las instrucciones de registro.
  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 bloqueada o en tu app.
    adb -e emu finger touch <finger_id>
    

    En Windows, posiblemente 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 elimina la necesidad de implementar tu propia interfaz de usuario de autenticación. Tu app debe usar esta función con una implementación de clave pública o secreta para la autenticación del usuario.

Para definir la duración del tiempo de espera en el que se puede volver a usar la misma clave después de que un usuario se haya autenticado correctamente, llama al nuevo método setUserAuthenticationValidityDurationSeconds() cuando configures KeyGenerator o KeyPairGenerator.

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

Para ver la manera en que la app implementa esta función, consulta la sección Ejemplo de cómo confirmar la credencial.

Vínculos 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. Según esta asociación, la plataforma puede determinar la app predeterminada que se debe usar para controlar un vínculo web en particular y omitir el paso en el cual se solicita a los usuarios que seleccionen una app. Para obtener información sobre la manera de implementar esta función, consulta Cómo manejar vínculos de apps.

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 tener Android 6.0 (nivel de API 23) como destino para habilitar este comportamiento; no necesitas agregar ningún otro código. 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 qué elementos incluir en la copia de seguridad del sistema de archivo, consulta Cómo configurar Auto Backup for Apps.

Direct Share

Esta versión te proporciona API para que los usuarios puedan compartir contenido de manera rápida e intuitiva. Ahora puedes definir destinos para compartir de forma directa que inician una actividad específica en tu app. Estos destinos se exponen a los usuarios mediante el menú Share. Esta función permite a los usuarios compartir contenido con los destinos, como los contactos, dentro de otras apps. Por ejemplo, el destino para compartir de forma directa podría iniciar una actividad en otra app de red social, lo cual permite al usuario compartir contenido directamente con una comunidad o un amigo específico de esa app.

A fin de habilitar destinos directos para compartir, debes definir una clase que extienda la clase ChooserTargetService. Declara tu servicio en el manifiesto. En esa declaración, especifica el permiso BIND_CHOOSER_TARGET_SERVICE y un filtro de intents con la acción SERVICE_INTERFACE.

En el ejemplo siguiente se muestra la manera en que podrías declarar 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

En esta versión se proporciona una nueva API de interacción de voz que, junto con las acciones de voz, te permite crear experiencias de voz naturales en tus apps. Llama al método isVoiceInteraction() para determinar si una acción de voz activó tu actividad. De ser así, tu app puede usar la clase VoiceInteractor para solicitar una confirmación de voz por parte del usuario y realizar una selección en una lista de opciones, entre otras alternativas.

La mayoría de las interacciones de voz se originan a partir de la acción de voz de un usuario. Una actividad de interacción de voz también puede, sin embargo, iniciarse sin la entrada del usuario. Por ejemplo, otra app iniciada por medio de una interacción de voz también puede enviar una intent para iniciar una interacción de voz. Para determinar si tu actividad se inició a partir de una búsqueda por voz del usuario o de otra app de interacción de voz, llama al método isVoiceInteractionRoot(). Si otra app inició tu actividad, el método muestra false. Tu app puede, entonces, solicitar 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 deseas aplicar esta función, el usuario debe habilitar el asistente para emplear el contexto actual. Una vez habilitado este, para invocarlo dentro de cualquier app el usuario debe mantener presionado el botón Home.

Tu app puede optar por no compartir el contexto actual con el asistente configurando el indicador FLAG_SECURE. Además del conjunto de información estándar que la plataforma transmite al asistente, tu app puede compartir información adicional usando la nueva clase AssistContent.

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

  1. Implementa la interfaz Application.OnProvideAssistDataListener.
  2. Registra este receptor usando registerOnProvideAssistDataListener().
  3. Para proporcionar información contextual específica de la actividad, anula el callback onProvideAssistData() y, opcionalmente, el nuevo callback onProvideAssistContent().

Dispositivos de almacenamiento adoptables

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

Si tu app accede a las API o los campos siguientes, ten en cuenta que las rutas de acceso a archivos que muestran cambiarán dinámicamente 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 conectada a un dispositivo Android mediante un cable USB On-The-Go (OTG) ejecutando 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 sincronizar y conectar una pluma stylus Bluetooth compatible con su teléfono o tablet. Mientras esta se halla conectada, 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 al utilizar solamente la pantalla táctil. Tu app puede obedecer cuando se presiona el botón de la pluma stylus y cuando se realizan acciones secundarias, al registrar 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 exploraciones de Bluetooth de bajo consumo, usa el nuevo método setCallbackType() para especificar que deseas que el sistema notifique callbacks cuando encuentre por primera vez un paquete de publicidad que coincida con el conjunto ScanFilter o cuando lo vea luego de un tiempo prolongado. Este enfoque de exploración es más eficaz en términos de consumo de energía que el de 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 proporcionar 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

Ahora, la plataforma permite que las apps soliciten que la resolución de pantalla se actualice a una representación 4K en el hardware compatible. Para consultar la resolución física actual, usa las nuevas Display.Mode API. Si la IU se establece en una resolución lógica más baja y esta última se aumenta a valores más altos, ten en cuenta que la resolución física que muestra el método getPhysicalWidth() puede ser diferente 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 configurando 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. Mientras se encuentra en el modo de pantalla 4K, la IU se continúa representando en la resolución original (por ejemplo, 1080p) y se aumenta a 4K, pero los objetos SurfaceView pueden mostrar contenido en la resolución nativa.

ColorStateLists para poder aplicar temas

Ahora, los atributos de tema son compatibles en ColorStateList para los dispositivos con Android 6.0 (nivel de API 23). Se ha discontinuado el uso de los métodos Resources.getColorStateList() y Resources.getColor(). Si deseas llamar a estas API, como alternativa, llama a los métodos nuevos Context.getColorStateList() o Context.getColor(). Estos métodos también se encuentran disponibles en la biblioteca appcompat v4 vía ContextCompat.

Características de audio

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

  • Compatibilidad para el protocolo MIDI, con las nuevas android.media.midi API. Usa estas API para enviar y recibir eventos MIDI.
  • Clases nuevas AudioRecord.Builder y AudioTrack.Builder para crear capturas de audio digital y objetos de reproducción respectivamente, y para configurar propiedades de receptores y fuentes de audio a fin de anular los valores predeterminados del sistema.
  • Enlaces de API para asociar dispositivos de entrada y de audio. Esto resulta particularmente útil si tu app permite a los usuarios iniciar una búsqueda por voz desde un controlador para juegos o un control remoto conectados a Android TV. El sistema invoca el nuevo callback onSearchRequested() cuando el usuario inicia una búsqueda. Para determinar si el dispositivo de entrada del usuario tiene un micrófono incorporado, recupera el objeto InputDevice de ese callback y luego llama al nuevo método hasMicrophone().
  • Método getDevices() nuevo que te permite recuperar una lista de todos los dispositivos de audio que se encuentren conectados al sistema en el 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 representar de forma sincrónica transmisiones de audio y video por Internet. Los búferes de audio se envían de manera que no generen bloqueo y se muestran mediante un callback. Además, se admite una velocidad de reproducción dinámica.
  • Nuevo evento EVENT_SESSION_RECLAIMED, que indica que una sesión abierta por la app se reclamó a través del administrador de recursos. Si tu app usa sesiones DRM, debes controlar este evento y asegurarte de no utilizar una sesión reclamada.
  • Nuevo código de error ERROR_RECLAIMED, que indica que el administrador de recursos reclamó el recurso de medios usado 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 indicación de la cantidad máxima de instancias concurrentes de códecs admitidas.
  • Nuevo método setPlaybackParams() para configurar la velocidad de reproducción multimedia de reproducciones rápidas o lentas. Además, se alarga o acelera la reproducción de audio de forma automática junto con el video.

Características de la cámara

En esta versión se incluyen las siguientes API nuevas para acceder a la luz de flash de la cámara y para el reprocesamiento de imágenes esta:

Flashlight API

Si un dispositivo de cámara cuenta con 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 esta 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 un callback para recibir una notificación sobre el estado del modo linterna, llama al método registerTorchCallback(). La primera vez que se registra el callback, 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 Camera2 API se extiende para admitir el reprocesamiento de imágenes privadas de formato opaco y YUV. Para determinar si estas capacidades de reprocesamiento se encuentran disponibles, llama a getCameraCharacteristics() y comprueba la clave REPROCESS_MAX_CAPTURE_STALL. Si un dispositivo admite reprocesamiento, puedes crear una sesión de captura de cámara reprocesable llamando a createReprocessableCaptureSession() y crear solicitudes para el reprocesamiento de búferes 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. Envía el búfer a la cámara llamando al método queueInputImage().

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

La clase ImageReader ahora admite secuencias de imagen de formato PRIVATE. Esta compatibilidad permite a tu app mantener una cola circular de imágenes de salida ImageReader, seleccionar una o más imágenes y enviarlas 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: El propietario del dispositivo ahora puede controlar las configuraciones que se describen a continuación para mejorar la administración de los dispositivos corporativos de uso único (COSU):
    • Inhabilitar o volver a habilitar la protección de seguridad con el método setKeyguardDisabled().
    • Inhabilitar o volver a habilitar la barra de estado (lo cual incluye configuraciones rápidas, notificaciones y el gesto de navegación al deslizar el dedo hacia arriba para iniciar Google Now) con el método setStatusBarDisabled().
    • Inhabilitar o volver a habilitar el inicio seguro con la constante DISALLOW_SAFE_BOOT de UserManager.
    • Evitar que se apague la pantalla mientras el dispositivo se encuentra conectado con la constante STAY_ON_WHILE_PLUGGED_IN.
  • Instalación y desinstalación automáticas de apps por parte del propietario del dispositivo: El propietario de un dispositivo ahora puede instalar y desinstalar aplicaciones de manera automática con las PackageInstaller API, independiente de Google Play for Work. Ahora, puedes aprovisionar los dispositivos a través de un propietario de dispositivo que obtiene e instala apps sin interacción del usuario. Esta característica es útil para habilitar el aprovisionamiento con un toque de quioscos u otros dispositivos similares sin activar una cuenta de Google.
  • Acceso automático al certificado de empresa: Ahora cuando una app llama a choosePrivateKeyAlias(), antes de que se indique al usuario que seleccione un certificado, el propietario del dispositivo o perfil puede llamar al método onChoosePrivateKeyAlias() para proporcionar el alias de forma automática a la aplicación que realiza la solicitud. Esta característica te permite otorgar a las apps gestionadas acceso a certificados sin interacción del usuario.
  • Aceptación automática de actualizaciones del sistema: Al configurar una política de actualización del sistema con setSystemUpdatePolicy(), el propietario del dispositivo ahora puede aceptar automáticamente una actualización del sistema (por ejemplo, en el caso de un dispositivo de quiosco) o posponerla y evitar que el usuario la ejecute durante un plazo de hasta 30 días. Además, un administrador puede configurar un período de tiempo diario en el que se debe ejecutar una actualización, por ejemplo, durante las horas en las cuales el dispositivo de quiosco no esté en uso. Cuando hay una actualización del sistema disponible, este verifica si la app del controlador de políticas del dispositivo definió una directiva de actualización del sistema y se comporta de manera correspondiente.
  • 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 DevicePolicyManager API de administración de certificados:
  • Seguimiento del uso de datos: Ahora, el propietario de un dispositivo o perfil puede consultar las estadísticas de uso de datos que se pueden ver en Settings > Data usando los nuevos métodos NetworkStatsManager. Los propietarios de perfiles reciben automáticamente permiso para consultar los datos del 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:

    El propietario de un dispositivo o perfil puede configurar una política de permisos para todas las solicitudes de tiempo de ejecución de todas las aplicaciones usando setPermissionPolicy(), a fin de solicitar confirmación al usuario para conceder el permiso, o bien conceder o negar el permiso automáticamente sin notificarlo. Si se configura esa última política, el usuario no puede modificar la selección realizada por el propietario del dispositivo o perfil dentro de la pantalla de permisos de la app en Settings.

  • VPN en Settings: Ahora se pueden visualizar las apps de la VPN en Settings > More > VPN. Además, las notificaciones que acompañan el uso de la VPN ahora son específicas para la manera en que dicha VPN está configurada. Para el propietario del perfil, las notificaciones son específicas según la VPN se configure 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 del estado del trabajo: Ahora aparecerá un ícono de maletín en la barra de estado siempre que una app del perfil administrado tenga una actividad en primer plano. Además, si el dispositivo se desbloquea directamente para la actividad de una app del perfil administrado, se mostrará una notificación del sistema para informar al usuario que se encuentra dentro del perfil de trabajo.