Android 6.0 (M) ofrece nuevas funciones para los usuarios y los desarrolladores de apps. En este documento, se proporciona una introducción sobre las APIs más destacadas.
Iniciar el desarrollo
Para 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 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 si agregas condiciones a tu código que verifiquen el nivel de API del sistema antes de ejecutar las APIs no compatibles con tu minSdkVersion
.
Si deseas obtener más información sobre cómo mantener la retrocompatibilidad, consulta Cómo brindar compatibilidad con diferentes versiones de la plataforma.
Para obtener más información sobre cómo funcionan los niveles de API, consulta ¿Qué es el nivel de API?
Autenticación por huellas dactilares
Esta versión ofrece nuevas APIs que te permiten autenticar usuarios mediante el escaneo de huellas dactilares 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 por huella dactilar en tu app y usar el ícono de huella dactilar 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 por huella dactilar, ten 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" />
![Un dispositivo móvil que muestra la funcionalidad de autenticación con huella dactilar](https://developer.android.com/static/images/android-6.0/fingerprint-screen.png?authuser=5&hl=es)
Para ver cómo una app implementa la autenticación por 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, consulta el video APIs de huella dactilar y pago.
Si estás evaluando esta función, sigue estos pasos:
- Instala la Revisión de herramientas de Android SDK versión 24.3 si todavía no lo hiciste.
- Inscribe una huella dactilar nueva en el emulador. Para ello, ve a Settings > Security > Huella dactilar y sigue las instrucciones de inscripción.
- 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 definger 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 implementar 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 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 autentique de forma correcta, llama al nuevo método setUserAuthenticationValidityDurationSeconds()
cuando configures KeyGenerator
o KeyPairGenerator
.
Evita mostrar el diálogo de reautenticación de forma excesiva. Las 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. Según 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. Si quieres obtener información para implementar esta función, consulta Cómo controlar los 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 orientarse a Android 6.0 (nivel de API 23) para habilitar este comportamiento; no es necesario que agregues 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 qué elementos incluir en la 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 en la que se muestra la funcionalidad de Direct Share](https://developer.android.com/static/images/android-6.0/direct-share-screen.png?authuser=5&hl=es)
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ú Share. Esta función permite que los usuarios compartan contenido con 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 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 puedes 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
En esta versión, se 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. De ser así, tu app puede usar la clase VoiceInteractor
para solicitar una confirmación por 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 con 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 desde 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.
Si quieres obtener más información para 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 optar por no compartir el contexto actual con Asistente configurando 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:
- Implementa la interfaz de
Application.OnProvideAssistDataListener
. - Registra este objeto de escucha con
registerOnProvideAssistDataListener()
. - Para proporcionar información contextual específica de la actividad, anula la devolución de llamada
onProvideAssistData()
y, de forma opcional, la nueva devolución de llamadaonProvideAssistContent()
.
Dispositivos de almacenamiento adoptables
Con esta actualizació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 comportarse como un almacenamiento interno. Esta función permite a los usuarios mover las apps y los datos privados de esas apps entre dispositivos de almacenamiento. Cuando mueve apps, el sistema respeta la preferencia android:installLocation
del manifiesto.
Si tu app accede a los siguientes campos o APIs, ten en cuenta que las rutas de acceso a 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.
- Métodos
Context
: - Campos
ApplicationInfo
:
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:
- Nuevo nivel de filtro
INTERRUPTION_FILTER_ALARMS
que corresponde al nuevo modo No interrumpir de Solo alarmas. - Se agregó un nuevo valor de categoría
CATEGORY_REMINDER
que se usa para distinguir recordatorios programados por el usuario de otros eventos (CATEGORY_EVENT
) y alarmas (CATEGORY_ALARM
). - Nueva clase
Icon
que puedes adjuntar a tus notificaciones a través de los métodossetSmallIcon()
ysetLargeIcon()
De manera similar, el métodoaddAction()
ahora acepta un objetoIcon
en lugar de un ID de recurso de elementos de diseño. - Nuevo método
getActiveNotifications()
que permite a las apps averiguar qué notificaciones están activas actualmente.
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á 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 solo 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:
- Si el usuario toca una pluma stylus con un botón en la pantalla de tu app, el método
getTooltype()
mostraráTOOL_TYPE_STYLUS
. - En el caso de las apps orientadas a Android 6.0 (nivel de API 23), el método
getButtonState()
muestraBUTTON_STYLUS_PRIMARY
cuando el usuario presiona el botón principal de la pluma stylus. Si la pluma stylus tiene un segundo botón, el mismo método muestraBUTTON_STYLUS_SECONDARY
cuando el usuario lo presiona. Si el usuario presiona ambos botones simultáneamente, el método muestra ambos valores juntos (BUTTON_STYLUS_PRIMARY
|BUTTON_STYLUS_SECONDARY
). -
En el caso de las apps orientadas a una versión anterior de la plataforma, el método
getButtonState()
muestraBUTTON_SECONDARY
(cuando se presiona el botón principal de la pluma stylus),BUTTON_TERTIARY
(cuando se presiona el botón secundario) o ambos.
Exploración mejorada de Bluetooth de bajo consumo
Si tu app realiza análisis de Bluetooth de bajo consumo, usa el nuevo método setCallbackType()
para especificar que quieres que el sistema notifique las devoluciones de llamada cuando encuentre por primera vez un paquete de publicidad que coincida con el conjunto ScanFilter
o cuando lo vea luego de un largo tiempo. Este enfoque de escaneo es más eficiente en términos 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()
.
Para solicitar al sistema que cambie la resolución física de tu app mientras se ejecuta, 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. Mientras se encuentra 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 en 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 las nuevas clases
AudioRecord.Builder
yAudioTrack.Builder
para crear captura de audio digital y objetos de reproducción, respectivamente, y configurar propiedades de receptor y fuente 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 objetoInputDevice
de esa devolución de llamada y luego llama al nuevo métodohasMicrophone()
. - Nuevo método
getDevices()
que te permite recuperar una lista de todos los dispositivos de audio conectados al sistema en el momento También puedes registrar un objetoAudioDeviceCallback
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 por Internet. Los búferes de audio se envían de manera que no generan bloqueo y se devuelven 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 el administrador de recursos reclamó una sesión abierta por la app. 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 de 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 una reproducción rápida o lenta. Además, alarga o acelera la reproducción de audio automáticamente junto con el video
Funciones de la cámara
Esta versión incluye las siguientes APIs nuevas para acceder a la linterna de la cámara y para 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 la 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 capacidades 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:
- Llama al método
dequeueInputImage()
. - Completa los datos en el búfer de entrada.
- Llama al método
queueInputImage()
para enviar el búfer a la cámara.
Si usas un objeto ImageWriter
junto con una imagen PRIVATE
, tu app no podrá acceder a los datos de la imagen de forma directa. 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 transmisiones de imágenes de formato PRIVATE
. Esta compatibilidad permite que tu app mantenga una cola de imágenes 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 un solo uso: El propietario del dispositivo ahora puede controlar los siguientes parámetros de configuración para mejorar la administración de dispositivos corporativos de uso único (COSU):
- Inhabilita o vuelve a habilitar el bloqueo de teclado con el método
setKeyguardDisabled()
. - Inhabilitar o volver 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
deUserManager
. - Evita que se apague la pantalla mientras el dispositivo está conectado con la constante
STAY_ON_WHILE_PLUGGED_IN
.
- Inhabilita o vuelve a habilitar el bloqueo de teclado con el método
- Instalación y desinstalación silenciosas 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 del dispositivo que recupera e instala apps sin interacción del usuario. Esta función es útil para habilitar el aprovisionamiento con un solo toque de kioscos y otros dispositivos similares sin activar una Cuenta de Google. - Acceso automático al certificado de empresa: Cuando una app llama a
choosePrivateKeyAlias()
, antes de que se le pida al usuario que seleccione un certificado, el propietario del dispositivo o perfil ahora puede llamar al métodoonChoosePrivateKeyAlias()
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 del 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 tome durante un máximo de 30 días. Además, un administrador puede establecer un período diario en el que se debe ejecutar una actualización, por ejemplo, durante las horas en 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 de certificados delegados: Un propietario de dispositivo o perfil ahora puede otorgar a una app de terceros la capacidad de llamar a estas APIs de administración de certificados de
DevicePolicyManager
: - Seguimiento del uso de datos. Un propietario de perfil o dispositivo ahora puede consultar las estadísticas de uso de datos visibles en Configuración > Uso de datos usando los nuevos métodos
NetworkStatsManager
. A los propietarios de perfiles se les otorga permiso automáticamente para consultar los 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 establecer una política de permisos para todas las solicitudes de tiempo de ejecución de todas las aplicaciones que usan
setPermissionPolicy()
a fin de solicitarle al usuario que otorgue el permiso, o bien otorgar o denegar automáticamente el permiso de forma silenciosa. Si se establece esta última política, el usuario no podrá modificar la selección realizada por el perfil o el propietario del dispositivo 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 del dispositivo, las notificaciones son específicas de si la VPN se configura 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.
![Dispositivo móvil que muestra la función de notificación de estado del trabajo en Android for Work](https://developer.android.com/static/images/android-6.0/work-profile-screen.png?authuser=5&hl=es)