Android 6.0 (M) ofrece nuevas funciones para los usuarios y los desarrolladores de apps. En este documento, se proporciona una introducción a las APIs más destacadas.
Empezar a programar
Para comenzar a compilar apps para Android 6.0, primero debes obtener el SDK de Android. Luego, usa SDK Manager para descargar la plataforma del SDK y las imágenes del sistema de Android 6.0.
Actualiza el nivel de API objetivo
Para optimizar mejor tu app para dispositivos que ejecutan Android, establece tu targetSdkVersion en "23", instala tu 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 agregando condiciones a tu código que verifiquen el nivel de API del sistema antes de ejecutar las APIs que no admite tu minSdkVersion.
Para obtener más información sobre cómo mantener la retrocompatibilidad, consulta Cómo admitir 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 con huella dactilar
En esta versión, se ofrecen nuevas APIs que te permiten autenticar usuarios con sus análisis de huellas dactilares en dispositivos compatibles. Usa estas APIs junto con el sistema de Android Keystore.
Para autenticar usuarios a través del análisis de huellas dactilares, obtén una instancia de la nueva clase FingerprintManager y llama al método authenticate(). Tu app debe ejecutarse en un dispositivo compatible con un sensor de huellas dactilares. Debes implementar la interfaz de usuario para el flujo de autenticación con huella dactilar en tu app y usar el ícono estándar de huella dactilar de Android en tu IU.
El ícono de huella digital de Android (c_fp_40px.png) se incluye en el ejemplo de autenticación biométrica.
Si desarrollas varias apps que usan la autenticación con huella dactilar, ten en cuenta que cada app debe autenticar la huella dactilar del usuario de forma 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 una implementación de la autenticación con huella dactilar en una app, consulta el ejemplo 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 de pago.
Si estás probando esta función, sigue estos pasos:
- Instala la revisión 24.3 de las herramientas del SDK de Android si aún no lo has hecho.
- Para inscribir una nueva huella dactilar en el emulador, ve a Configuración > Seguridad > Huella dactilar y, luego, sigue las instrucciones de inscripción.
- Usa un emulador para simular eventos de toque de huella dactilar 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>.
Confirmación de credenciales
Tu app puede autenticar a los usuarios según la última vez que desbloquearon su dispositivo. Esta función libera a los usuarios de tener que recordar contraseñas adicionales específicas de la app y evita que debas 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 durante el cual se puede volver a usar la misma clave después de que un usuario se autentica correctamente, llama al nuevo método setUserAuthenticationValidityDurationSeconds() cuando configures un KeyGenerator o un KeyPairGenerator.
Evita mostrar el diálogo de reautenticación en exceso. Tus apps deben intentar usar el objeto criptográfico primero y, si se agota el tiempo de espera, usar el método createConfirmDeviceCredentialIntent() para reautenticar al usuario en tu app.
Vinculación de la app
Esta versión mejora el sistema de intents de Android, ya que proporciona una vinculación de aplicaciones más potente. Esta función te permite asociar una app con un dominio web que te pertenece. 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 la solicitud a los usuarios para que seleccionen una app. Para obtener información sobre cómo implementar esta función, consulta Cómo controlar vínculos de aplicaciones.
Copia de seguridad automática de apps
Ahora el sistema realiza copias de seguridad y restablecimientos completos de datos automáticos para las apps. Tu app debe segmentarse para 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 borran sus datos de copia de seguridad. Para obtener información sobre cómo funciona esta función y cómo configurar los elementos de los que se creará una copia de seguridad en el sistema de archivos, consulta Cómo configurar la Copia de seguridad automática para apps.
Compartir directo
En este lanzamiento, se proporcionan APIs para que los usuarios puedan compartir contenido de forma intuitiva y rápida. 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 destinos, como contactos, dentro de otras apps. Por ejemplo, el destino de uso compartido directo podría iniciar una actividad en otra app de redes sociales, lo que permite al usuario compartir contenido directamente con un amigo o una comunidad específicos en esa app.
Para habilitar los destinos 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 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 la 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 por voz que, junto con las Acciones por voz, te permite crear experiencias de voz conversacionales en tus apps. Llama al método isVoiceInteraction() para determinar si una acción por voz activó tu actividad. Si es así, tu app puede usar la clase VoiceInteractor para solicitar una confirmación por voz del usuario, seleccionar una opción de una lista y mucho más.
La mayoría de las interacciones por voz se originan a partir de una acción de voz del usuario. Sin embargo, una actividad de interacción por voz también puede iniciarse sin la entrada del usuario. Por ejemplo, otra app que se inicia a través de una interacción por voz también puede enviar un intent para iniciar una interacción por 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 devuelve false. Luego, tu app puede pedirle al usuario que confirme que quería realizar esta acción.
Para obtener más información sobre la implementación de acciones de voz, consulta el sitio para desarrolladores de Acciones de voz.
API de Assist
Esta versión ofrece una nueva forma para que los usuarios interactúen con tus apps a través de un asistente. Para usar esta función, el usuario debe habilitar el asistente para que use el contexto actual. Una vez habilitado, el usuario puede invocar al asistente en cualquier app manteniendo presionado el botón de inicio.
Tu app puede optar por no compartir el contexto actual con el 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 de 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 manera opcional, la nueva devolución de llamadaonProvideAssistContent().
Dispositivos de almacenamiento adoptable
Con este lanzamiento, los usuarios pueden adoptar dispositivos de almacenamiento externos, como tarjetas SD. Si adoptas un dispositivo de almacenamiento externo, se encriptará y formateará para que se comporte como almacenamiento interno. Esta función permite a los usuarios mover tanto las apps como los datos privados de esas apps entre dispositivos de almacenamiento. Cuando se mueven 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 los archivos que devuelven cambiarán de forma dinámica cuando la app se mueva entre dispositivos de almacenamiento interno y externo. Cuando compiles rutas de archivos, te recomendamos que siempre llames a estas APIs de forma dinámica. No uses rutas de acceso de archivos codificadas de forma rígida ni conserves rutas de acceso de archivos completamente calificadas que se hayan compilado anteriormente.
- Métodos de
Context: - Campos
ApplicationInfo:
Para depurar esta función, puedes habilitar la adopción de una unidad USB conectada a un dispositivo Android a través de un cable USB On-The-Go (OTG) ejecutando este comando:
$ adb shell sm set-force-adoptable true
Notificaciones
En esta versión, se agregan los siguientes cambios en la API para las notificaciones:
- Nuevo nivel de filtro
INTERRUPTION_FILTER_ALARMSque corresponde al nuevo modo No interrumpir Solo alarmas. - Nuevo valor de categoría
CATEGORY_REMINDERque se usa para distinguir los recordatorios programados por el usuario de otros eventos (CATEGORY_EVENT) y alarmas (CATEGORY_ALARM). - Nueva clase
Iconque puedes adjuntar a tus notificaciones a través de los métodossetSmallIcon()ysetLargeIcon(). Del mismo modo, el métodoaddAction()ahora acepta un objetoIconen lugar de un ID de recurso de elementos de diseño. - Nuevo método
getActiveNotifications()que permite que tus apps sepan cuáles de sus notificaciones están activas.
Compatibilidad con pluma stylus Bluetooth
Esta versión proporciona una mejor compatibilidad con la entrada del usuario a través de un lápiz Bluetooth. Los usuarios pueden vincular y conectar un lápiz óptico Bluetooth compatible con su teléfono o tablet. Mientras está conectado, la información de posición de la pantalla táctil se fusiona con la información de presión y botones del lápiz para proporcionar un mayor rango de expresión que con la pantalla táctil sola. Tu app puede detectar las pulsaciones de los botones del lápiz óptico y realizar acciones secundarias registrando objetos View.OnContextClickListener y GestureDetector.OnContextClickListener en tu actividad.
Usa los métodos y las constantes de MotionEvent para detectar interacciones con los botones de la pluma:
- Si el usuario toca una pluma stylus con un botón en la pantalla de tu app, el método
getTooltype()devuelveTOOL_TYPE_STYLUS. - En el caso de las apps que se segmentan para Android 6.0 (nivel de API 23), el método
getButtonState()devuelveBUTTON_STYLUS_PRIMARYcuando el usuario presiona el botón principal de la pluma. Si el lápiz óptico tiene un segundo botón, el mismo método devuelveBUTTON_STYLUS_SECONDARYcuando el usuario lo presiona. Si el usuario presiona ambos botones de forma simultánea, el método devuelve ambos valores unidos con OR (BUTTON_STYLUS_PRIMARY|BUTTON_STYLUS_SECONDARY). -
En el caso de las apps que segmentan versiones de plataforma anteriores, el método
getButtonState()devuelveBUTTON_SECONDARY(para la presión del botón principal del lápiz),BUTTON_TERTIARY(para la presión del botón secundario del lápiz) o ambos.
Mejora en la búsqueda de dispositivos Bluetooth de bajo consumo
Si tu app realiza análisis de Bluetooth de bajo consumo, usa el nuevo método setCallbackType() para especificar que deseas que el sistema notifique las devoluciones de llamada cuando encuentre por primera vez, o vea después de mucho tiempo, un paquete de anuncio que coincida con el conjunto ScanFilter. Este enfoque de la búsqueda es más eficiente en cuanto al 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 con la especificación Hotspot 2.0 Release 1 en los dispositivos Nexus 6 y Nexus 9. Para aprovisionar credenciales de Hotspot 2.0 en tu app, usa los nuevos métodos 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 se mejore la resolución de pantalla a la renderización en 4K en hardware compatible. Para consultar la resolución física actual, usa las nuevas APIs de Display.Mode. Si la IU se dibuja con una resolución lógica más baja y se aumenta a una resolución física más grande, ten en cuenta que la resolución física que devuelve el método getPhysicalWidth() puede diferir de la resolución lógica que informa getSize().
Puedes solicitarle al sistema que cambie la resolución física en tu app mientras se ejecuta. Para ello, configura la propiedad preferredDisplayModeId de la ventana de tu app. Esta función es útil si deseas cambiar 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 mejora a 4K, pero los objetos SurfaceView pueden mostrar contenido en la resolución nativa.
ColorStateLists con temas
Ahora se admiten atributos de tema 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 de appcompat v4 a través de ContextCompat.
Funciones de audio
Esta versión agrega mejoras al procesamiento de audio en Android, incluidas las siguientes:
- Compatibilidad con el protocolo MIDI, con las nuevas APIs de
android.media.midiUsa estas APIs para enviar y recibir eventos MIDI. - Nuevas clases
AudioRecord.BuilderyAudioTrack.Builderpara crear objetos de captura y reproducción de audio digital, respectivamente, y configurar las propiedades de origen y receptor de audio para anular los valores predeterminados del sistema - Son hooks de API para asociar dispositivos de audio y entrada. Esto es especialmente útil si tu app permite que los usuarios inicien una búsqueda por voz desde un control de juegos o un control remoto conectado 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 objetoInputDevicede 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 actualmente al sistema. También puedes registrar un objetoAudioDeviceCallbacksi quieres que el sistema notifique a tu app cuando se conecte o desconecte un dispositivo de audio.
Funciones de video
En esta versión, se agregan nuevas capacidades a las APIs de procesamiento de video, incluidas las siguientes:
- Nueva clase
MediaSyncque ayuda a las aplicaciones a renderizar de forma síncrona transmisiones de audio y video. Los búferes de audio se envían de forma no bloqueante y se devuelven a través de una devolución de llamada. También admite la velocidad de reproducción dinámica. - Nuevo evento
EVENT_SESSION_RECLAIMED, que indica que el administrador de recursos recuperó 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 recuperada. - Nuevo código de error
ERROR_RECLAIMED, que indica que el administrador de recursos recuperó el recurso multimedia que usaba el códec. Con esta excepción, se debe liberar el códec, ya que pasó a un estado terminal. - Nueva interfaz
getMaxSupportedInstances()para obtener una sugerencia sobre la cantidad máxima de instancias de códec simultáneas admitidas. - Nuevo método
setPlaybackParams()para establecer la velocidad de reproducción de contenido multimedia para la reproducción en cámara rápida o lenta. También estira 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:
API de linterna
Si un dispositivo de cámara tiene una unidad de flash, puedes llamar al método setTorchMode() para activar o desactivar el modo de linterna de la unidad de flash sin abrir el dispositivo de cámara. La app no tiene la propiedad exclusiva de la unidad de flash ni del dispositivo de cámara. El modo de linterna se apaga y deja de estar disponible cuando el dispositivo de cámara deja de estar 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 de linterna. Cuando se cierra la última app que activó el modo de linterna, se desactiva el modo de linterna.
Puedes registrar una devolución de llamada para recibir notificaciones sobre el estado del modo de linterna llamando al método registerTorchCallback(). La primera vez que se registra la devolución de llamada, se la llama de inmediato con el estado del modo de linterna de todos los dispositivos de cámara conocidos actualmente que tienen una unidad de flash. Si el modo de linterna se activa o desactiva correctamente, se invoca el método onTorchModeChanged().
API de Reprocessing
Se extendió la API de Camera2 para admitir el reprocesamiento de imágenes en formato opaco privado y YUV. Para determinar si estas capacidades de reprocesamiento están disponibles, llama a getCameraCharacteristics() y busca 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 este modelo de programació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 podrá 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 de búfer.
La clase ImageReader ahora admite transmisiones de imágenes en formato PRIVATE. Esta compatibilidad permite que tu app mantenga una cola circular de imágenes de salida de ImageReader, seleccione una o más imágenes y las envíe a ImageWriter para el reprocesamiento de la cámara.
Funciones de Android for Work
Esta versión incluye las siguientes APIs nuevas para Android for Work:
- Controles mejorados para dispositivos de uso único propiedad de la empresa: El propietario del dispositivo ahora puede controlar los siguientes parámetros de configuración para mejorar la administración de los dispositivos de uso único propiedad de la empresa (COSU):
- Inhabilita o vuelve a habilitar el bloqueo de pantalla con el método
setKeyguardDisabled(). - Inhabilita o vuelve a habilitar la barra de estado (incluida la configuración rápida, las notificaciones y el gesto de deslizar el dedo hacia arriba para navegar que inicia Google Now) con el método
setStatusBarDisabled(). - Inhabilita o vuelve a habilitar el inicio seguro con la constante
UserManagerDISALLOW_SAFE_BOOT. - Evita que la pantalla se apague mientras el dispositivo está enchufado con la constante
STAY_ON_WHILE_PLUGGED_IN.
- Inhabilita o vuelve a habilitar el bloqueo de pantalla con el método
- Instalación y desinstalación silenciosa de apps por parte del propietario del dispositivo: Ahora, el propietario del dispositivo puede instalar y desinstalar aplicaciones de forma silenciosa con las APIs de
PackageInstaller, independientemente de Google Play para Empresas. Ahora puedes aprovisionar 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 o 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 perfil o del dispositivo ahora puede llamar al métodoonChoosePrivateKeyAlias()para proporcionar el alias de forma silenciosa a la aplicación solicitante. Esta función te permite otorgar acceso a certificados a apps administradas sin interacción del usuario. - Aceptación automática de actualizaciones del sistema. Si se establece 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 realice durante un máximo de 30 días. Además, un administrador puede establecer un período diario en el que se debe realizar una actualización, por ejemplo, durante las horas en que no se usa un dispositivo de kiosco. 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 en consecuencia. -
Instalación de certificados delegada: Un propietario de perfil o dispositivo ahora 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 del perfil o del dispositivo puede consultar las estadísticas de uso de datos que se muestran en Configuración > Uso de datos con los nuevos métodos
NetworkStatsManager. Los propietarios del perfil obtienen automáticamente permiso para consultar los datos del perfil que administran, mientras que los propietarios del dispositivo obtienen acceso a los datos de uso del usuario principal administrado. - Administración de permisos de tiempo de ejecución:
El propietario del perfil o del dispositivo puede establecer una política de permisos para todas las solicitudes de tiempo de ejecución de todas las aplicaciones con
setPermissionPolicy(), ya sea para solicitar al usuario que otorgue el permiso o para otorgarlo o rechazarlo automáticamente de forma silenciosa. Si se establece esta última política, el usuario no podrá modificar la selección que realice el propietario del perfil o del dispositivo en la pantalla de permisos de la app en Configuración. - VPN en Configuración: Las apps de VPN ahora son visibles en Configuración > Más > VPN. Además, las notificaciones que acompañan el uso de la VPN ahora son específicas de cómo se configura esa VPN. En el caso del propietario del perfil, las notificaciones son específicas para indicar si la VPN está configurada para un perfil administrado, un perfil personal o ambos. En el caso del propietario del dispositivo, las notificaciones son específicas para indicar si la VPN está configurada para todo el dispositivo.
- Notificación de estado de 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 en la actividad de una app en el perfil administrado, se muestra un mensaje de aviso que notifica al usuario que se encuentra en el perfil de trabajo.