Android 6.0 (M) ofrece nuevas funciones para los usuarios y desarrolladores de apps. En este documento, se brinda una introducción a las APIs más distinguidas.
Empezar a programar
Para comenzar a crear apps para Android 6.0, primero debes obtener el SDK de Android. Luego, usa el Administrador de SDK para descargar las imágenes del sistema y la plataforma de SDK de Android 6.0.
Actualiza el nivel de tu API de destino
Para optimizar mejor tu app para dispositivos con Android, configura 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 las APIs de Android y, al mismo tiempo, admitir versiones anteriores si agregas condiciones a tu código que comprueben el nivel de API del sistema antes de ejecutar las APIs no compatibles con tu 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 APIs que te permiten autenticar usuarios a través del escaneo de sus huellas dactilares en dispositivos compatibles. Usa estas APIs 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 ejecutar en un dispositivo compatible con un sensor de huellas dactilares. 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 autenticación biométrica.
Si desarrollas varias apps que usan autenticación por huella digital, ten en cuenta que cada app debe autenticar la huella digital 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 cómo una app implementa la autenticación por huellas dactilares, consulta el ejemplo de autenticación biométrica. Para ver una demostración de la manera en que puedes usar estas APIs de autenticación con otras APIs de Android, mira el video APIs de Fingerprint y Payment.
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.
- Registra una huella dactilar nueva en el emulador; para ello, ve a Settings > Security > Fingerprint y sigue las instrucciones de registro.
- 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 elimina 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 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 un 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 usar el método createConfirmDeviceCredentialIntent()
para volver a autenticar el 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 debe usar para controlar un vínculo web en particular y omitir el paso en el que se solicita a los usuarios que seleccionen una app. Para aprender a 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 archivos, consulta Cómo configurar la copia de seguridad automática para 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 objetivos de uso compartido directo que inician una actividad específica en tu app. Estos objetivos se exponen a los usuarios a través del menú Compartir. Esta función permite a los usuarios compartir contenido con los destinos, como los 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 una comunidad o un amigo específicos en esa app.
Para 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 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 quieras 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 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, realizar una selección en una lista de opciones 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. Una actividad de interacción de voz también puede, sin embargo, iniciarse sin la entrada del usuario. Por ejemplo, otra app iniciada a través de 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 búsqueda 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
. 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. Para usar esta función, el usuario debe habilitar el asistente para usar el contexto actual. Una vez habilitado, para invocarlo dentro de cualquier app, el usuario debe mantener presionado el botón Inicio.
Tu app puede optar por no compartir el contexto actual con el asistente configurando la marca 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:
- 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, opcionalmente, la nueva devolución de llamadaonProvideAssistContent()
.
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 que actúe 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
en el manifiesto.
Si tu app accede a las siguientes APIs o campos, 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.
- 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 ocupado Solo alarmas. - 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 que tus apps descubran qué notificaciones se encuentran actualmente activas.
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 cuando solo se utiliza 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:
- Si el usuario toca una pluma stylus con un botón en la pantalla de tu app, el método
getTooltype()
muestraTOOL_TYPE_STYLUS
. - Para 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 al mismo tiempo, el método muestra ambos valores juntos con OR (BUTTON_STYLUS_PRIMARY
|BUTTON_STYLUS_SECONDARY
). -
Para las apps orientadas a una versión anterior de la plataforma, el método
getButtonState()
muestraBUTTON_SECONDARY
(cuando se presiona el botón principal),BUTTON_TERTIARY
(cuando se presiona el botón secundario) o ambos.
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 devoluciones de llamadas 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 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
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 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 más alta, 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 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 con ColorStateList
para dispositivos con 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 en su lugar a los nuevos métodos Context.getColorStateList()
o Context.getColor()
. 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
yAudioTrack.Builder
para crear capturas de audio digitales y objetos de reproducción respectivamente, y configurar las propiedades de la fuente y el receptor de audio para 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 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 incorporado, 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 que se encuentren conectados al sistema. 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 representar de forma sincrónica transmisiones de audio y video. Los búferes de audio se envían de manera que no generan bloqueo 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 el administrador de recursos reclamó una sesión abierta por la app. Si tu app usa sesiones de 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 que usa 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ódec admitidas. - Se agregó un nuevo método
setPlaybackParams()
para establecer la velocidad de reproducción de contenido multimedia de reproducción rápida o lenta. Además, alarga o acelera la reproducción de audio de forma automática junto con el video.
Funciones de la cámara
Esta versión incluye las siguientes APIs nuevas para acceder a la luz de flash 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 que se conocen actualmente y que tengan una unidad de flash. 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 comprueba 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.
- 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 directamente. 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 imágenes de formato PRIVATE
. Esta compatibilidad permite a tu app mantener una cola circular de imágenes de salida de 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 los siguientes parámetros de configuración para mejorar la administración de dispositivos corporativos de uso único (COSU):
- Inhabilita o vuelve a habilitar la protección de teclado con el método
setKeyguardDisabled()
. - Inhabilitar o volver a habilitar la barra de estado (lo que 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
UserManager
DISALLOW_SAFE_BOOT
. - Evita que se apague la pantalla mientras el dispositivo se encuentra conectado con la constante
STAY_ON_WHILE_PLUGGED_IN
.
- Inhabilita o vuelve a habilitar la protección de teclado con el método
- 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 APIs de
PackageInstaller
, 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 función es útil para habilitar el aprovisionamiento con un toque de kioscos y otros dispositivos similares sin activar una Cuenta de Google. - Acceso silencioso 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é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. Si 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 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 que el dispositivo de quiosco 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 definió una directiva de actualización del sistema y se comporta según corresponda. -
Instalación de certificados delegados: 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
: - 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 Configuración > Datos 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 que usan
setPermissionPolicy()
, para solicitar confirmación al usuario para conceder el permiso, o bien conceder o negar el permiso automáticamente sin notificarlo. Si estableces esta última política, el usuario no podrá modificar la selección que hizo el propietario del dispositivo o perfil dentro de la pantalla de permisos de la app en Configuración. - VPN en Configuración: Las apps de VPN ahora están visibles en Configuración > Más > VPN. Además, las notificaciones que acompañan el uso de la VPN ahora son específicas de la configuración de esa VPN. 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. En el caso de un propietario de dispositivo, las notificaciones son específicas dependiendo de si la VPN se configuró para todo el dispositivo.
- Notificación del estado del trabajo: Ahora aparecerá un ícono de maletín en la barra de estado cada vez 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.