Android 8.0 (nivel de API 26) presenta una variedad de funciones y capacidades nuevas para usuarios y desarrolladores. En este documento, se destacan las novedades para desarrolladores.
Asegúrate de revisar también los cambios de comportamiento en Android 8.0 para obtener información sobre las áreas en las que los cambios en la plataforma pueden afectar tus apps.
Experiencia del usuario
Modo de imagen en imagen
Pantalla en pantalla en Android 8.0
Android 8.0 (nivel de API 26) permite iniciar actividades en modo de pantalla en pantalla (PIP). PIP es un tipo especial de modo multiventana que se usa principalmente para la reproducción de videos. El modo PIP estaba disponible originalmente para Solo para Android TV En Android 8.0, la función está disponible en otros dispositivos Android.
Cuando una actividad está en modo de PIP, se encuentra en estado de pausa, pero debe
seguir mostrando contenido. Por este motivo, debes asegurarte de que tu app no pause la reproducción en su controlador onPause()
. En su lugar, debes pausar el video en onStop()
y reanudar la reproducción en onStart()
. Para obtener más información, consulta Ciclo de vida en el modo de ventanas múltiples.
Para especificar que tu actividad puede usar el modo PIP, establece
android:supportsPictureInPicture
como verdadero en el manifiesto.
(A partir de Android 8.0, el PIP no requiere el atributo del manifiesto android:resizeableActivity
.
Sin embargo, debes establecer
android:resizeableActivity
como "true" si tu actividad admite otras
modos multiventana).
Android 8.0 (nivel de API 26) presenta un objeto nuevo, PictureInPictureParams
, que pasas a los métodos PIP para especificar cómo debe comportarse una actividad cuando está en el modo PIP. Este objeto especifica propiedades, como
la relación de aspecto preferida de tu actividad.
Los métodos de PIP existentes descritos en Agregar Ahora, la función Pantalla en pantalla se usan en todos los dispositivos Android, no solo en Android TV. Además, Android 8.0 proporciona los siguientes métodos para brindar compatibilidad Modo PIP:
Activity.enterPictureInPictureMode(PictureInPictureParams args)
Coloca la actividad en el modo de pantalla en pantalla. La relación de aspecto de la actividad y otros parámetros de configuración se especifican a través de args. Si algún campo en args está vacío, el sistema usa los valores establecidos la última vez que llamaste aActivity.setPictureInPictureParams()
.La actividad especificada se ubica en una esquina de la pantalla; el resto de esta última se abarca con la actividad previa. La actividad que ingresa en el modo PIP entra en un estado de pausa, pero permanece activa. Si el usuario presiona la actividad en el modo PIP, el sistema muestra un menú con el cual el usuario podrá interactuar. Ningún evento táctil alcanza la actividad mientras funciona en el modo PIP.
-
Activity.setPictureInPictureParams()
Actualiza los ajustes de configuración de PIP de una actividad. Si la actividad se encuentra actualmente en el modo PIP, las configuraciones se actualizan. Esto resulta útil si la relación de aspecto de una actividad cambia. Si la actividad no se encuentra en el modo PIP, se usan estos parámetros de configuración independientemente del métodoenterPictureInPictureMode()
que llames.
Notificaciones
En Android 8.0 (nivel de API 26), rediseñamos las notificaciones para proporcionar una manera más sencilla y uniforme de administrar su comportamiento y sus configuraciones. Entre esos cambios se incluye lo siguiente:
- Canales de notificación: Android 8.0 presenta canales de notificación que te permiten crear un canal que el usuario puede personalizar para cada tipo de notificación que desees mostrar. La interfaz de usuario se refiere a los canales de notificaciones como categorías de notificación. Para obtener información sobre cómo implementar canales de notificación, consulta Administra canales de notificaciones.
- Puntos de notificación: Android 8.0 incorpora compatibilidad para la visualización puntos o insignias en los íconos de selector de aplicaciones. Los puntos de notificación reflejan el Presencia de notificaciones que el usuario aún no ha descartado ni utilizado. Para obtener información sobre cómo trabajar con puntos de notificación, consulta Notificación insignias.
- Posponer: Los usuarios pueden posponer las notificaciones, lo que hace que desaparezcan durante un período antes de volver a aparecer. Las notificaciones vuelven a reaparecer con el mismo nivel de importancia con el que aparecieron por primera vez. Las apps pueden quitar o actualizar una notificación pospuesta, pero la actualización de una notificación pospuesta no hace que vuelva a aparecer.
- Tiempos de espera de las notificaciones: Puedes establecer un tiempo de espera cuando creas una
notificación mediante
setTimeoutAfter()
Puedes usar este método para especificar el tiempo que durará una notificación debe cancelarse. Si es necesario, puedes cancelar la notificación antes de la transcurra la duración del tiempo de espera especificado. - Configuración de notificaciones: Puedes llamar a
setSettingsText()
para establecer el texto que aparece cuando creas un vínculo a la configuración de notificaciones de tu app desde una notificación que use el intentNotification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES
. El sistema puede proporcionar los siguientes extras con la intención de filtrar la configuración que tu app debe mostrar a los usuarios:EXTRA_CHANNEL_ID
,NOTIFICATION_TAG
yNOTIFICATION_ID
. - Descartar notificaciones: Los usuarios pueden descartar las notificaciones por su cuenta, y las apps pueden quitarlas de forma programática. Para determinar cuándo se descarta una notificación y por qué, puedes implementar el método
onNotificationRemoved()
de la claseNotificationListenerService
. - Colores de fondo: Puedes establecer y habilitar un color de fondo para una
notificación. Solo debes usar esta función en notificaciones para
tareas en curso que son esenciales para que un usuario las vea de un vistazo. Por ejemplo, puedes configurar un color de fondo para las notificaciones relacionadas con indicaciones de manejo o una llamada de teléfono en curso. También puedes configurar el color de fondo deseado con
setColor()
. Hacerlo te permite usarsetColorized()
para habilitar el uso de un color de fondo en una notificación. - Estilo de mensajería: En Android 8.0, las notificaciones que usan la clase
MessagingStyle
muestran más contenido en su forma contraída. Debes usar la claseMessagingStyle
para notificaciones relacionadas con la mensajería. También puedes usar MétodoaddHistoricMessage()
para proporcionar contexto a una conversación agregando mensajes históricos a las notificaciones relacionadas con la mensajería.

Los usuarios pueden presionar de forma prolongada los íconos del selector de apps para ver las notificaciones en Android 8.0.
Autofill Framework
La creación de cuentas, el acceso y las transacciones con tarjetas de crédito llevan tiempo y son propensas a errores. Los usuarios pueden frustrarse fácilmente ante apps que requieren estos tipos de tareas repetitivas.
Android 8.0 (nivel de API 26) permite completar formularios, como el acceso. tarjetas de crédito y tarjetas de crédito, gracias a la introducción de Autofill Framework. Las apps existentes y nuevas funcionan con Autofill Framework después de que el usuario acepta autocompletar.
Puedes tomar algunas medidas para optimizar la manera en la que tu aplicación funciona con el marco. Para obtener más información, consulta Descripción general del framework de Autofill.
Fuentes descargables
Android 8.0 (nivel de API 26) y la biblioteca de compatibilidad de Android 26 te permiten solicitar fuentes de un en lugar de agrupar fuentes en el APK o dejar que el Fuentes de descarga de APK. Esta función reduce el tamaño del APK, aumenta la app tasa de éxito de instalaciones y permite que varias apps compartan la misma fuente.
Para obtener más información sobre la descarga de fuentes, consulta Fuentes para descargar:
Fuentes en XML
Android 8.0 (nivel de API 26) presenta una nueva función, Fuentes en XML, que te permite usar las fuentes como recursos. Esto significa, que no hay necesidad de integrar fuentes como recursos. Las fuentes se compilan en un archivo R
y se crean automáticamente
disponible en el sistema como recurso. Luego, puedes acceder a estas fuentes con el
ayuda de un nuevo tipo de recurso, font
.
La biblioteca de compatibilidad 26 proporciona compatibilidad total con esta función en dispositivos. con la versión 14 o una posterior de la API.
Para obtener más información sobre el uso de fuentes como recursos y la recuperación de fuentes del sistema, consulta consulta Fuentes en XML.
Ajuste automático de tamaño de TextView
Android 8.0 (nivel de API 26) te permite configurar el tamaño del texto expandido o se contraen automáticamente según el tamaño de TextView. Esto significa que es mucho sea más fácil optimizar el tamaño del texto en diferentes pantallas o con contenido dinámico. Para obtener más información, sobre el ajuste automático de tamaño de TextView en Android 8.0, consulta Ajuste automático de tamaño de TextView.
Íconos adaptables
Android 8.0 (nivel de API 26) presenta íconos de selector adaptables. Los íconos adaptables admiten elementos visuales y puede mostrar distintas formas en distintos modelos de dispositivos. Para aprender a hacer lo siguiente: crear íconos adaptables, consulta la sección Íconos adaptables .
Administración de color
Los desarrolladores de apps de imágenes para Android ahora pueden aprovechar los nuevos dispositivos que tengan una pantalla compatible con una amplia gama de colores. Cómo mostrar una amplia gama imágenes, las apps deberán habilitar un parámetro en su manifiesto (por actividad) y cargar mapas de bits con un perfil de color amplio incorporado (AdobeRGB, Pro Photo RGB, DCI-P3, etcétera).
WebView API
Android 8.0 proporciona varias APIs para ayudarte a administrar los objetos WebView
que muestran contenido web en tu app. Estas APIs, que mejoran la estabilidad y la seguridad de tu app, incluyen las siguientes:
- API de versión
- Google SafeBrowsing API
- Termination Handle API
- API de Renderer Importance
Para obtener más información sobre cómo usar estas APIs, consulta Cómo administrar WebViews.
La clase WebView
ahora incluye una API de Navegación segura para mejorar la seguridad de la navegación web. Para obtener más información, consulta
API de Navegación segura de Google.
Fijación de combinaciones de teclas y widgets
En Android 8.0 (nivel de API 26), se presenta la fijación de combinaciones de teclas y widgets en la app. En tu app, puedes crear accesos directos y widgets fijados para selectores admitidos, sujetos al permiso del usuario.
Para obtener más información, consulta la guía de funciones de Fijación de combinaciones de teclas y Widgets.
Relación de aspecto máxima de la pantalla
Android 8.0 (nivel de API 26) introduce cambios en la configuración de la relación de aspecto máxima de una app.
En primer lugar, Android 8.0 presenta el atributo maxAspectRatio, que puedes usar para establecer la relación de aspecto máxima de tu app. Además, en Android 8.0 y versiones posteriores, la relación de aspecto máxima predeterminada de una app es la relación de aspecto nativa del dispositivo en el que se ejecuta la app.
Para obtener más información sobre cómo declarar la relación de aspecto máxima, consulta Compatibilidad con diferentes pantallas.
Compatibilidad con pantallas múltiples
A partir de Android 8.0 (nivel de API 26), la plataforma ofrece compatibilidad mejorada con varias pantallas. Si una actividad admite un modo con ventanas múltiples y se ejecuta en un dispositivo con visualizaciones múltiples, los usuarios pueden mover la actividad de una visualización a otra. Cuando una app inicia una actividad, puede especificar en qué pantalla debe ejecutarse.
Nota: Si una actividad admite el modo multiventana, Android 8.0 habilita automáticamente la compatibilidad con varias pantallas para esa actividad. Tienes que probar tu app para asegurarte de que funcione de modo adecuado en un entorno de varias pantallas.
Solo se puede reanudar una actividad a la vez, aunque el estado la app tiene varias pantallas. La actividad con enfoque está en el estado reanudado; todas las demás actividades visibles se pausan, pero no se detienen. Para obtener más información sobre el ciclo de vida de las actividades cuando varias actividades son visibles, consulta Ciclo de vida en el modo de ventanas múltiples.
Cuando un usuario mueve una actividad de una visualización a otra, el sistema modifica el tamaño de la actividad y emite cambios de tiempo de ejecución según sea necesario. Tu actividad puede administrar el cambio de configuración por sí misma o permitir que el sistema destruya el proceso que contiene tu actividad y la vuelva a crear con las nuevas dimensiones. Para obtener más información, consulta Cómo controlar la configuración Cambios.
ActivityOptions
proporciona dos métodos nuevos para admitir varias pantallas:
setLaunchDisplayId()
- Especifica la visualización en la cual se debe mostrar la actividad cuando se inicia.
getLaunchDisplayId()
- Devuelve la pantalla de lanzamiento actual de la actividad.
El shell de abd se extiende para admitir varias pantallas.
Ahora se puede usar el comando shell start
para iniciar una actividad.
y especificar la pantalla de destino de la actividad:
adb shell start <activity_name> --display <display_id>
Márgenes y relleno con diseño unificado
Android 8.0 (nivel de API 26) facilita la especificación de situaciones en las que lados opuestos
de un elemento View
usan el mismo margen o padding.
Específicamente, ahora puedes usar los siguientes atributos en tu XML de diseño
archivos:
-
layout_marginVertical
, que definelayout_marginTop
ylayout_marginBottom
al mismo tiempo. -
layout_marginHorizontal
, que definelayout_marginLeft
ylayout_marginRight
al mismo tiempo. -
paddingVertical
, que definepaddingTop
ypaddingBottom
al mismo tiempo. -
paddingHorizontal
, que definepaddingLeft
ypaddingRight
al mismo tiempo.
Nota: Si personalizas la lógica de tu app para admitir diferentes idiomas y culturas, incluida la orientación del texto, ten en cuenta que estos atributos no afectan los valores de layout_marginStart
, layout_marginEnd
, paddingStart
ni paddingEnd
. Puedes configurar estos valores tú mismo, además de los nuevos atributos de diseño horizontal y vertical, para crear un comportamiento de diseño que dependa de la orientación del texto.
Captura de puntero
Algunas apps, como juegos, escritorio remoto y clientes de virtualización, al controlar el puntero del mouse. La captura del puntero es una nueva en Android 8.0 (nivel de API 26) que proporciona ese control mediante la entrega de todos los eventos del mouse a una vista enfocada en tu app.
A partir de Android 8.0, un View
en tu app puede solicitar la captura de puntero y definir un objeto de escucha para procesar los eventos capturados de puntero. En este modo, el puntero del mouse permanece escondido. La vista puede liberar la captura de puntero cuando ya no necesita la información del mouse. El sistema también puede liberar la captura de puntero cuando la vista pierde el foco; por ejemplo, cuando el usuario abre otra app.
Para obtener información sobre cómo usar esta función en tu app, consulta Captura de punteros.
Categorías de apps
Android 8.0 (nivel de API 26) permite que cada app declare una categoría adecuada
cuando sea relevante. Estas categorías se usan para agrupar apps de similares
propósito o función cuando se presentan a los usuarios, como en Uso de datos, Uso de batería o
Uso del almacenamiento. Puedes definir una categoría para tu app configurando el atributo android:appCategory
en la etiqueta del manifiesto <application>
.
Lanzador de Android TV
Android 8.0 (nivel de API 26) incluye una nueva app centrada en el contenido, La experiencia de la pantalla principal de Android TV, que está disponible con imagen del dispositivo del emulador de Android TV y Nexus Player para Android 8.0. La nueva pantalla principal organiza el contenido de video en filas correspondientes a los canales, que se completan con programas de una app del sistema. Las apps pueden publicar varios canales, y los usuarios pueden configurar en qué canales que deseas ver en la pantalla de inicio. La pantalla principal de Android TV también incluye la fila Ver a continuación, que se completados con programas de apps, según los hábitos de visualización del usuario. Las apps también pueden brindar vistas previas de videos, que se reproducen automáticamente cuando un usuario se centra en un programa. Las APIs para completar canales y programas son parte de las APIs de TvProvider, que se distribuyen como un módulo de la biblioteca de compatibilidad de Android en Android 8.0.
AnimatorSet
A partir de Android 8.0 (nivel de API 26), la API de AnimatorSet
admite la búsqueda y la reproducción en sentido inverso. La búsqueda te permite establecer la posición de la animación configurada en un
en un momento determinado. La reproducción en orden inverso es útil si tu app incluye animaciones.
para acciones que se pueden deshacer. En lugar de definir dos animaciones separadas
puedes reproducir el mismo a la inversa.
Entrada y navegación
Clústeres de navegación con teclado
Si una actividad de tu app usa una jerarquía de vistas compleja, como la de la Figura 2: Considera organizar grupos de elementos de la IU en clústeres para que sea más fácil navegación con teclado entre ellas. Los usuarios pueden presionar Meta+Tab, o Búsqueda+Tab en Chromebook para navegar de un clúster a otro. Buenos ejemplos de grupos incluyen: paneles laterales, barras de navegación, áreas de contenido principales y elementos que podría contener muchos elementos secundarios.

Para hacer un clúster a partir de un elemento View
o ViewGroup
, establece el atributo android:keyboardNavigationCluster
en true
en el archivo en formato XML de diseño del elemento o pasa true
a setKeyboardNavigationCluster()
en la lógica de IU de tu app.
Nota: Los clústeres no se pueden anidar, aunque no están anidados.
pueden aparecer en diferentes niveles de la jerarquía. Si intentas anidar clústeres, el framework solo considerará el elemento ViewGroup
que se encuentra más arriba como un clúster.
En dispositivos con pantallas táctiles, puedes establecer un clúster designado
ViewGroup
objeto
android:touchscreenBlocksFocus
elemento a true
para
permitir la navegación solo dentro y fuera del clúster. Si aplicas esto
configuración en un clúster, los usuarios no pueden usar la tecla Tab ni las teclas de flecha para
navegar dentro o fuera del clúster; deberá presionar el botón de navegación del clúster
combinación de teclas.
Foco predeterminado de las vistas
En Android 8.0 (nivel de API 26), puedes asignar el View
que debería
reciben el foco después de que se reanuda una actividad (re)creada y el usuario presiona un
tecla de navegación del teclado, como la tecla Tab. Para aplicar este parámetro de configuración “enfocado de forma predeterminada”, establece el atributo android:focusedByDefault
de un elemento View
en true
en el archivo en formato XML de diseño que contiene el elemento de IU o pasa true
a setFocusedByDefault()
en la lógica de IU de tu app.
Salida de voz
Las actividades y los servicios pueden usar instancias de TextToSpeech
para dictar y pronunciar contenido. A partir de Android 8.0 (nivel de API 26), tu app puede obtener información de sincronización más precisa sobre el momento en que un motor de texto a voz comienza a articular palabras individuales sintetizadas, siempre que el motor proporcione esta información. Puedes usar esta función
llamar la atención sobre palabras específicas a medida que el motor de texto a voz habla
de ellos.
Para usar estas mejoras del motor de texto a voz en tu app, registra una instancia de UtteranceProgressListener
. Como parte del
de registro, debes incluir un controlador para
onRangeStart()
.
El motor de texto a voz llama
rangeStart()
para grabar
el momento en el que se espera la reproducción de audio de un rango específico de texto
para comenzar. Cuando comienza la reproducción del audio de ese rango de texto, se ejecuta el método onRangeStart()
de tu app. Luego, tu app puede responder a esta devolución de llamada, por ejemplo, destacando el rango de texto asociado con la frase.
Para obtener más información sobre el seguimiento del progreso de reproducción de texto a voz
consulta la clase UtteranceProgressListener
referencia.
Sistema
Nuevos detectores StrictMode
Android 8.0 (nivel de API 26) agrega tres detectores StrictMode nuevos para ayudar a identificar posibles errores en tu app:
detectUnbufferedIo()
detectará cuándo tu app lee o escribe datos sin almacenamiento en búfer, lo que puede afectar drásticamente rendimiento.detectContentUriWithoutPermission()
detectará cuando tu app olvide otorgar permisos a otra app por accidente cuando inicie una actividad fuera de tu app.detectUntaggedSockets()
detectará cuándo tu app realiza tráfico de red sin usarsetThreadStatsTag(int)
a fin de etiquetar tu tráfico para la depuración comerciales.
Datos almacenados en caché
Android 8.0 (nivel de API 26) brinda una mejor orientación y mejores comportamientos en torno a los datos almacenados en caché. Cada
La app ahora recibe una cuota de espacio en disco para los datos almacenados en caché, como lo muestra
getCacheQuotaBytes(UUID)
Cuando el sistema deba liberar espacio en el disco, comenzará por borrar los archivos almacenados en caché de las aplicaciones que más hayan superado su cuota asignada. Por lo tanto, si mantienes el volumen de datos almacenados en caché en valores inferiores al de la cuota asignada, tus archivos almacenados en caché estarán entre los últimos del sistema que se borrarán cuando sea necesario. Cuando el sistema decida qué archivos almacenados en caché eliminar en tu app, considera primero los archivos más antiguos (según lo determinado por la hora de modificación).
También hay dos comportamientos nuevos que puedes habilitar por directorio para controlar cómo el sistema libera tus datos almacenados en caché:
StorageManager.setCacheBehaviorAtomic()
se puede usar para indicar que un directorio y todo su contenido se deberían borrar como una sola unidad atómica.setCacheBehaviorTombstone(File, boolean)
se puede usar para indicar que, en lugar de eliminar archivos dentro de un directorio, se trunquen hasta una extensión de 0 bytes y que el archivo vacío quede intacto.
Por último, cuando necesites asignar espacio en disco para archivos grandes, considera usar el nuevo
API de allocateBytes(FileDescriptor, long)
, que borrará automáticamente
los archivos almacenados en caché que pertenecen a otras aplicaciones (según sea necesario) para cumplir con su solicitud. Al decidir si los
dispositivo tenga espacio suficiente en el disco para guardar tus datos nuevos, llama
getAllocatableBytes(UUID)
en lugar de usar
getUsableSpace()
, ya que el primero considerará cualquier almacenamiento
que el sistema está dispuesto a borrar en tu nombre.
Paginación de proveedores de contenido
Actualizamos los proveedores de contenido para incluir compatibilidad con la carga de un conjunto de datos grande, de a una página a la vez. Por ejemplo, una app de fotos con miles de imágenes puede consultar un subconjunto de los datos que se presentarán en una página. Cada página de los resultados que muestra un proveedor de contenido se representa con un solo cursor . Un cliente y un proveedor deben implementar la paginación para usar esta función.
Para obtener información detallada sobre los cambios en los proveedores de contenido, consulta
ContentProvider
y
ContentProviderClient
Solicitudes de actualización de contenido
Los operadores ContentProvider
y
Ahora cada clase ContentResolver
incluye un
refresh()
, lo que permite a los clientes saber con mayor facilidad si
esté actualizada la información solicitada.
Puedes agregar lógica de actualización de contenido personalizada extendiendo
ContentProvider
Asegúrate de anular el
Método refresh()
para mostrar
true
, que les indica a los clientes de su proveedor que intentó
para actualizar los datos por tu cuenta.
La app de tu cliente puede solicitar contenido de manera explícita actualizado llamando a un método diferente, también llamado refresh()
. Cuando lo llames
pasa el URI de los datos que se actualizarán.
Nota: Como es posible que solicites datos a través de una red,
deberías invocar a refresh()
desde
el cliente solo cuando haya indicios concretos de que el contenido es obsoleto.
El motivo más común para actualizar el contenido de este tipo es en respuesta a
la opción de deslizar para actualizar
para solicitar explícitamente que la IU actual muestre contenido actualizado.
Mejoras de JobScheduler
Android 8.0 (nivel de API 26) presenta varias mejoras para JobScheduler
. Estas mejoras facilitan el uso de tu app
para cumplir con la nueva antecedente
y límites de ejecución, ya que, por lo general, puedes usar trabajos programados para reemplazar
servicios en segundo plano o receptores de transmisiones implícitas ahora restringidos.
Entre las actualizaciones de JobScheduler
, se incluyen las siguientes:
-
Ahora puedes asociar una cola de trabajo con un trabajo programado. Para agregar un elemento de trabajo a la cola de una tarea, llama a
JobScheduler.enqueue()
. Cuando la tarea se encuentra en ejecución, puede tomar trabajo pendiente de la cola y procesarlo. Esta funcionalidad maneja muchos de los casos de uso que previamente hubiesen realizado llamadas para iniciar servicios en segundo plano, en especial aquellos que implementanIntentService
. -
La biblioteca de compatibilidad de Android 26.0.0 presenta una nueva clase
JobIntentService
, que ofrece la misma funcionalidad queIntentService
, pero usa trabajos en lugar de servicios cuando se ejecuta en Android 8.0 (nivel de API 26) o versiones posteriores. -
Ahora puedes llamar a
JobInfo.Builder.setClipData()
para asociar unClipData
con un trabajo. Esta opción te permite asociar otorgamientos de permisos de URI con un trabajo, de manera similar a cómo se pueden propagar estos permisos aContext.startService()
. También puedes usar otorgamientos de permisos de URI con intents en las colas de trabajo. -
Los trabajos programados ahora son compatibles con varias restricciones nuevas:
JobInfo.isRequireStorageNotLow()
- El trabajo no se ejecuta si el almacenamiento disponible del dispositivo es bajo.
JobInfo.isRequireBatteryNotLow()
- El trabajo no se ejecuta si el nivel de la batería es igual o inferior al nivel crítico umbral; este es el nivel en el que el dispositivo muestra el estado de Batería baja Advertencia del sistema.
NETWORK_TYPE_METERED
- La tarea requiere una conexión de red medida, como sucede con la mayoría de los planes de datos móviles.
Almacén de datos personalizados
Android 8.0 (nivel de API 26) te permite proporcionar un almacén de datos personalizado para tus preferencias, que puede ser útil si tu app almacena las preferencias en una base de datos local o en la nube. si las preferencias son específicas del dispositivo. Para obtener más información para implementar el almacén de datos, consulta Almacén de datos personalizados.
Mejoras de medios
VolumeShaper
Hay una clase VolumeShaper
nueva. Usa
para realizar transiciones de volumen automatizadas breves, como fundido de entrada, fundido de salida y fundido cruzado.
Consulta Cómo controlar la amplitud con VolumeShaper
para obtener más información.
Mejoras de foco de audio
Las apps de audio comparten la salida de audio en un dispositivo solicitando y abandonando el foco del audio.
Una app maneja los cambios en el foco iniciando o deteniendo la reproducción, o atenuando su volumen.
Hay una clase AudioFocusRequest
nueva. Cuando se usa esta clase como parámetro de requestAudioFocus()
, las apps tienen nuevas capacidades para controlar los cambios en el foco de audio: atenuación automática y aumento demorado de foco.
Métricas de medios
Un nuevo método getMetrics()
muestra un PersistableBundle
.
objeto que contiene la configuración
y de rendimiento, expresada como un mapa de atributos y valores.
El método getMetrics()
se define para estas clases de contenido multimedia:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
Las métricas se recopilan por separado para cada instancia y se conservan durante su ciclo de vida. Si no hay métricas disponibles, el método devuelve null. Las métricas reales que se muestran dependen de la clase.
MediaPlayer
A partir de Android 8.0 (nivel de API 26), MediaPlayer puede reproducir contenido. Protegido por DRM y medios encriptados a nivel de muestra HLS.
Android 8.0 presenta un nuevo comando seekTo()
sobrecargado que proporciona un control detallado cuando se busca un fotograma. Incluye un segundo parámetro que especifica un modo de búsqueda:
SEEK_PREVIOUS_SYNC
mueve la posición del contenido multimedia a un fotograma de sincronización (o clave) asociado con una fuente de datos que se encuentra justo antes o en el momento determinado.SEEK_NEXT_SYNC
mueve la posición del contenido multimedia a un fotograma de sincronización (o clave) asociado con una fuente de datos que se encuentra justo después o en el momento determinado.SEEK_CLOSEST_SYNC
mueve la posición del contenido multimedia a un fotograma de sincronización (o clave) asociado con una fuente de datos que se encuentra más cerca o en el momento determinado.SEEK_CLOSEST
mueve la posición del contenido multimedia a un fotograma (no necesariamente un fotograma de sincronización o clave) asociado con una fuente de datos que se encuentra más cerca o en el momento determinado.
Cuando se buscan segmentos de forma continua, las apps deben usar cualquiera de los modos SEEK_
en lugar de SEEK_CLOSEST
, que se ejecuta de forma relativamente más lenta, pero puede ser más preciso.
MediaRecorder
- MediaRecorder ahora admite el formato MPEG2_TS, que es útil para
transmitiendo:
Kotlin
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
Java
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
consulta
MediaRecorder.OutputFormat
MediaMuxer
ahora puede controlar cualquier cantidad de transmisiones de audio y video. Ya no estás limitado a una pista de audio o una pista de video. UsaaddTrack()
para mezclar tantas pistas como desees.MediaMuxer
también puede agregar una o más pistas de metadatos con información por fotograma definida por el usuario. Tu aplicación es la que define el formato de los metadatos. El la pista de metadatos solo es compatible con contenedores MP4.
Los metadatos pueden ser útiles para el procesamiento sin conexión. Por ejemplo, las señales giroscópicas del sensor podrían usarse para la estabilización de video.
Cuando se agrega una pista de metadatos, el formato MIME de la pista debe comenzar con el prefijo
“application/”. Escribir metadatos es lo mismo que escribir datos de video y audio, excepto
que los datos no provienen de una MediaCodec
. En cambio, la app pasa un ByteBuffer
con una marca de tiempo asociada al método writeSampleData()
.
La marca de tiempo tiene que estar en la misma base de tiempo que las pistas de video y audio.
El archivo MP4 generado usa el TextMetaDataSampleEntry
definido en la sección
12.3.3.2 de la ISOBMFF para indicar el formato MIME de los metadatos Cuando se usa MediaExtractor
para extraer el archivo con pista de metadatos, el formato MIME de los metadatos se extrae en MediaFormat
.
Acceso mejorado a archivos multimedia
El
El framework de acceso al almacenamiento (SAF) permite que las apps expongan una red
DocumentsProvider
, que puede proporcionar acceso a los archivos
de una fuente de datos a otras apps. De hecho, un
proveedor de documentos incluso puede brindar acceso a archivos
que residen en el almacenamiento de red o que usan un protocolo como
Protocolo de transferencia multimedia (MTP).
Sin embargo, el acceso a archivos multimedia de gran tamaño desde una fuente de datos remota presenta algunos desafíos:
- Los reproductores multimedia requieren acceso que admita búsquedas para un archivo a través de un proveedor de documentos. Cuando un archivo multimedia grande reside en una fuente de datos remota, el el proveedor de documentos debe recuperar todos los datos con anticipación y crear una instantánea descriptor de archivos. El reproductor multimedia no puede reproducir el archivo sin él descriptor, por lo que la reproducción no podrá comenzar hasta que finalice el proveedor de documentos descargando el archivo.
- Los administradores de colecciones multimedia, como las apps de fotos, deben recorrer una serie de acceder a URI para llegar al contenido multimedia almacenado en una tarjeta SD externa mediante individuales. Este patrón de acceso realiza operaciones masivas en los medios, como mover, copiar y borrar, bastante lento.
- Los administradores de colecciones multimedia no pueden determinar la ubicación de un documento debido a su URI Esto dificulta que estos tipos de apps les permitan a los usuarios elegir dónde guardar un archivo multimedia.
Android 8.0 aborda cada uno de estos desafíos mejorando el marco de trabajo de acceso a almacenamiento.
Proveedores de documentos personalizados
A partir de Android 8.0, el marco de trabajo de acceso a almacenamiento permite a los proveedores de documentos personalizados crear descriptores de archivos que admitan búsquedas para archivos que residan en una fuente de datos remota. El SAF puede abrir un archivo para obtener un descriptor de archivos que admitan búsquedas. Luego, el SAF proporciona solicitudes de bytes discretas al proveedor de documentos. Esta función permite a un proveedor de documentos mostrar el rango de bytes exacto que una aplicación de reproducción multimedia solicita, en lugar de almacenar en caché el archivo completo por adelantado.
Para usar esta función, debes llamar al nuevo método StorageManager.openProxyFileDescriptor()
. El
El método openProxyFileDescriptor()
acepta un objeto ProxyFileDescriptorCallback
como devolución de llamada. El SAF invoca
la devolución de llamada cada vez que una aplicación cliente realice operaciones de archivo en la
descriptor de archivo que muestra el proveedor de documentos.
Acceso directo a documentos
A partir de Android 8.0 (nivel de API 26), puedes usar la
getDocumentUri()
para
Obtén un URI que hace referencia al mismo documento que el objeto mediaUri
especificado.
Sin embargo, debido a que el URI que se muestra está respaldado por un DocumentsProvider
, los administradores de la colecciones multimedia pueden acceder al documento directamente, sin tener que explorar árboles de directorios determinados.
Como resultado, los administradores de medios pueden realizar operaciones relacionadas con archivos en el documento.
mucho más rápido.
Precaución: El método getDocumentUri()
solo localiza archivos multimedia; no otorga a las apps permiso para acceder a esos archivos. Para obtener más información sobre cómo obtener un permiso para acceder a los archivos multimedia, consulta la documentación de referencia.
Rutas de acceso a los documentos
Cuando usas el framework de acceso al almacenamiento en Android 8.0 (nivel de API 26), puedes usar la
Método findDocumentPath()
, disponible en ambos
la DocumentsContract
y
DocumentsProvider
para determinar la ruta desde la raíz de un sistema de archivos según la carga
ID. El método devuelve la ruta de acceso en un
DocumentsContract.Path
. En los casos en que un archivo
sistema tiene varias rutas definidas para el mismo documento, el método devuelve
la ruta de acceso que se usa con mayor frecuencia para llegar al documento con el ID determinado.
Esta funcionalidad es especialmente útil en las siguientes situaciones:
- Tu app usa un diálogo “Guardar como” en el que se muestra la ubicación de un documento en particular.
- Tu app muestra carpetas en una vista de resultados de búsqueda y debe cargar los documentos secundarios que se encuentran dentro de una carpeta especial si el usuario la selecciona.
Nota: Si tu app tiene permiso para acceder solo a algunos documentos
en la ruta, el valor que se muestra de findDocumentPath()
solo incluye
las carpetas y los documentos a los que puede acceder tu aplicación.
Cómo supervisar la reproducción de audio
El servicio del sistema AudioManager
mantiene una lista de objetos AudioPlaybackConfiguration
activos, cada uno de los cuales contiene información sobre una sesión de reproducción de audio en particular. Tu app puede hacer lo siguiente:
recuperar el conjunto de parámetros de configuración activos actualmente llamando
getActivePlaybackConfigurations()
A partir de Android 8.0 (nivel de API 26), puedes registrar una devolución de llamada que notifique
tu app cuando una o más
AudioPlaybackConfiguration
objetos cambiaron. Para ello, llama a registerAudioPlaybackCallback()
y pasa una instancia de AudioManager.AudioPlaybackCallback
. La clase AudioManager.AudioPlaybackCallback
contiene el método onPlaybackConfigChanged()
, al que el sistema llama cuando cambia la configuración de reproducción de audio.
Conectividad
Reconocimiento de Wi-Fi
Android 8.0 (nivel de API 26) incorpora compatibilidad con reconocimiento de Wi-Fi, que se basa en la función Neighbor Especificación de Awareness Networking (NAN). En los dispositivos que cuenten con el hardware de reconocimiento de Wi-Fi adecuado, las apps y los dispositivos cercanos pueden realizar detecciones y establecer comunicaciones a través de Wi-Fi sin un punto de acceso por Internet. Estamos trabajando con nuestros socios de hardware para integrar la tecnología de reconocimiento de Wi-Fi a los dispositivos lo antes posible. Para obtener información sobre cómo integrar el reconocimiento de Wi-Fi a tu app, consulta Reconocimiento de Wi-Fi.
Bluetooth
Android 8.0 (nivel de API 26) enriquece la compatibilidad de la plataforma con Bluetooth agregando lo siguiente atributos:
- Compatibilidad con AVRCP 1.4 estándar, lo que permite explorar la biblioteca de canciones.
- Compatibilidad con Bluetooth Low-Energy (BLE) 5.0 estándar.
- Integración del códec de Sony LDAC a la pila Bluetooth.
Sincronización de dispositivos complementarios
Android 8.0 (nivel de API 26) proporciona las APIs que te permiten personalizar el diálogo de solicitud de sincronización cuando intentes sincronizar dispositivos complementarios a través de Bluetooth, BLE y Wi-Fi. Para obtener más información, consulta Dispositivo complementario Vinculación.
Para obtener más información sobre el uso de Bluetooth en Android, consulta la guía de Bluetooth. Si deseas información sobre los cambios de Bluetooth específicos para Android 8.0 (nivel de API 26), consulta la sección Bluetooth de la página Cambios de comportamiento de Android 8.0.
Uso compartido
Uso compartido inteligente
Android 8.0 (nivel de API 26) aprende sobre las capacidades uso compartido personalizado preferencias y a comprender mejor cada tipo de contenido, cuáles son para compartir. Por ejemplo, si un usuario toma una foto de un recibo, Android 8.0 puede sugerir una app de seguimiento de gastos. Si el usuario se toma una selfie, una app de redes sociales puede manejar mejor la imagen. Android 8.0 aprende automáticamente todo esto de patrones de acuerdo con las métricas preferencias personalizadas.
El uso compartido inteligente funciona para tipos de contenido que no sean image
, como audio
, video
, text
, URL
, etcétera.
Para habilitar el uso compartido inteligente, agrega un ArrayList
de hasta tres
de cadenas de texto al intent que comparte el contenido. Las anotaciones deben describir los componentes o temas principales en el contenido. En el siguiente ejemplo de código, se muestra cómo agregar anotaciones al intent:
Kotlin
val annotations: ArrayList<String> = arrayListOf( "topic1", "topic2", "topic3" ) intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations )
Java
ArrayList<String> annotations = new ArrayList<>(); annotations.add("topic1"); annotations.add("topic2"); annotations.add("topic3"); intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations );
Para obtener información detallada sobre las anotaciones de uso compartido inteligente, consulta EXTRA_CONTENT_ANNOTATIONS
.
Clasificador de texto
En dispositivos compatibles, las apps pueden usar un nuevo clasificador de texto para verificar si una cadena coincide con un tipo de entidad de clasificador conocido y obtener alternativas de selección sugeridas. Las entidades reconocidas por el sistema incluyen direcciones, URLs,
números de teléfono y direcciones de correo electrónico. Para obtener más información, consulta TextClassifier
.
Accesibilidad
Android 8.0 (nivel de API 26) admite varias funciones de accesibilidad nuevas para desarrolladores que crean sus propios servicios de accesibilidad:
- Una nueva categoría de volumen para ajustar accesibilidad Volumen.
- Gestos de huellas dactilares como mecanismo de entrada
- Multilingüe de texto a voz.
- Un acceso directo de accesibilidad basado en hardware para acceder rápidamente a un servicio de accesibilidad preferido.
- Compatibilidad con continuación gestos o secuencias programáticas de trazos.
- Un botón de accesibilidad para invocar una de varias funciones de accesibilidad habilitadas (disponible solo en dispositivos que usan un área de navegación renderizada por software)
- Estandarización valores de rango unilaterales.
- Varias funciones para procesar texto con mayor facilidad, incluido el texto de sugerencia y las ubicaciones de los caracteres de texto en la pantalla
Seguridad y privacidad
Permisos
Android 8.0 (nivel de API 26) presenta varios permisos nuevos relacionados con la telefonía:
- El permiso
ANSWER_PHONE_CALLS
permite que tu app responda llamadas telefónicas entrantes de forma programática. Para controlar una llamada telefónica entrante en tu app, puedes usar el métodoacceptRingingCall()
. - El
El permiso
READ_PHONE_NUMBERS
otorga a tu app acceso de lectura a los números de teléfono almacenados en un dispositivo.
Estos permisos se clasifican como peligrosos y forman parte del grupo de permisos PHONE
.
Acceso a la cuenta nueva y las API de detección
Android 8.0 (nivel de API 26) introduce varias mejoras en relación con las apps obtienen acceso a las cuentas de usuario. Para las cuentas que administran, los autenticadores pueden usar su propia política para decidir si ocultan o muestran cuentas a una app. El sistema Android rastrea las aplicaciones que pueden acceder a una cuenta en particular.
En versiones anteriores de Android, las apps que querían rastrear la lista de
las cuentas de usuario debían recibir actualizaciones de todas las cuentas, incluidas las cuentas con
tipos no relacionados. En Android 8.0, se incorpora
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
que permite a las apps especificar una lista de tipos de cuentas
para qué cuentas se deben recibir cambios.
Cambios en la API
AccountManager proporciona seis métodos nuevos para ayudar a los autenticadores a administrar cuáles las apps pueden ver una cuenta:
setAccountVisibility(android.accounts.Account, java.lang.String, int)
: Configura el nivel de visibilidad para una combinación de cuenta de usuario y paquete específica.-
getAccountVisibility(android.accounts.Account, java.lang.String)
: Obtiene el nivel de visibilidad para una cuenta de usuario específica y una combinación de paquetes. -
getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)
Permite a los autenticadores obtener las cuentas y los niveles de visibilidad de un paquete determinado. -
getPackagesAndVisibilityForAccount(android.accounts.Account)
Permite a los autenticadores obtener valores de visibilidad almacenados para una cuenta determinada. -
addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>)
: Permite a los autenticadores inicializar los valores de visibilidad de una cuenta. -
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
Agrega un objeto de escuchaOnAccountsUpdateListener
al ObjetoAccountManager
. El sistema llama a este objeto de escucha cada vez que cambia la lista de cuentas del dispositivo.
Android 8.0 (nivel de API 26) presenta dos valores de nombre de paquete especiales para especificar los niveles de visibilidad de las aplicaciones que no se configuraron con el método setAccountVisibility(android.accounts.Account, java.lang.String, int)
. El valor de visibilidad PACKAGE_NAME_KEY_LEGACY_VISIBLE
se aplica en las apps que tienen el permiso GET_ACCOUNTS
y en las versiones de destino de Android anteriores a Android 8.0, o cuyas firmas coinciden con el autenticador dirigido a cualquier versión de Android.
PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE
proporciona un valor de visibilidad predeterminado para las apps que no se configuraron previamente y para las que PACKAGE_NAME_KEY_LEGACY_VISIBLE
no es aplicable.
Para obtener más información sobre el acceso a la cuenta nueva y las APIs de descubrimiento, consulta la
referencia para
AccountManager
y
OnAccountsUpdateListener
Prueba
Pruebas de instrumentación
Android 8.0 (nivel de API 26) proporciona los siguientes elementos de compatibilidad adicional para las pruebas de instrumentación de tu app.
Ejecución en procesos de apps no predeterminadas
Ahora puedes especificar que se debe ejecutar una prueba de instrumentación en particular un proceso fuera del proceso predeterminado de tu app. Esta configuración es útil si tu app contiene varias actividades que se ejecutan en procesos diferentes.
Para definir la instrumentación de un proceso no predeterminado, navega hacia tu archivo de manifiesto y, luego, hacia el elemento <instrumentation>
deseado. Agrega el atributo android:targetProcess
y establece su valor en una de las siguientes opciones:
- el nombre de un proceso en particular;
- una lista de nombres de procesos separados por comas;
- Un comodín (
"*"
), que permite que la instrumentación se ejecute en cualquier proceso lanzado que ejecute código en el paquete especificado en el atributoandroid:targetPackage
.
Mientras se ejecuta la prueba de instrumentación, puedes verificar qué procesos
que está realizando la prueba llamando a getProcessName()
.
Informar resultados durante una prueba
Ahora puedes informar resultados durante tu prueba de instrumentación, en lugar de hacerlo cuando finalice, llamando a addResults()
.
Intents falsos para pruebas
Para facilitar la creación de pruebas de IU independientes y aisladas para las aplicaciones
actividades, Android 8.0 (nivel de API 26) presenta el
onStartActivity()
. Anula este método en una subclase personalizada del
Instrumentation.ActivityMonitor
para manejar una clase en particular
que tu clase de prueba invoca.
Cuando tu clase de prueba invoca la intent, el método muestra un objeto auxiliar Instrumentation.ActivityResult
en lugar de ejecutar la intent. Cuando usas esta lógica de intents simulados en tus pruebas, puedes enfocarte en cómo tu actividad prepara y controla el intent que pasas a una actividad diferente o a una app totalmente diferente.
Tiempo de ejecución y Herramientas
Optimizaciones de plataforma
Android 8.0 (nivel de API 26) incorpora a la plataforma optimizaciones de tiempo de ejecución y de otros aspectos que dan como resultado varias mejoras del rendimiento. Entre estas optimizaciones se incluyen la recolección de elementos no usados de compactación simultánea, un uso más eficiente de la memoria y la ubicación de código.
Estas optimizaciones reducen los tiempos de inicio y mejoran el rendimiento del SO y de las apps.
Compatibilidad actualizada con el lenguaje Java
Android 8.0 (nivel de API 26) agrega compatibilidad con varias API de Java de OpenJDK adicionales:
java.time
de OpenJDK 8.java.nio.file
yjava.lang.invoke
de OpenJDK 7.
Para obtener más información sobre las clases y los métodos en estos , consulta la documentación de referencia de la API.
Si deseas usar funciones del lenguaje Java 8 en Android Studio, deberías descarga la versión preliminar más reciente.
API actualizadas del marco de trabajo ICU4J de Android
Android 8.0 (nivel de API 26) extiende las APIs de ICU4J Android Framework, que son un subconjunto de las APIs de ICU4J, para que los desarrolladores de apps las usen en el paquete android.icu
. Estas APIs usan datos de ubicación que están presentes en el dispositivo, para que puedas reducir la superficie de APK sin compilar las bibliotecas ICU4J en el APK.
Tabla 1: Versiones de ICU, CLDR y Unicode usadas en Android.
Nivel de Android API | Versión de ICU | Versión de CLDR | Versión Unicode |
---|---|---|---|
Android 7.0 (nivel de API 24), Android 7.1 (nivel de API 25) | 56 | 28 | 8.0 |
Android 8.0 (nivel de API 26) | 58.2 | 30.0.3 | 9.0 |
Para obtener más información sobre la internacionalización en Android, puedes consultar las siguientes secciones: Compatibilidad con ICU4J, consulta Internacionalización en Android.
Android para empresas
Se presentaron nuevas funciones y APIs empresariales para dispositivos con Android 8.0 (nivel de API 26). Entre los aspectos destacados, se incluyen los siguientes:
- Los perfiles de trabajo en dispositivos completamente administrados permiten a las empresas separar los datos de trabajo de los personales y administrar ambos.
- La delegación de API permite a los propietarios de dispositivos y perfiles asignar la app administración a otras aplicaciones.
- Mejoras en la experiencia del usuario en el flujo de aprovisionamiento (incluidas las mejoras opciones de personalización) reducen el tiempo de configuración.
- Los controles nuevos sobre los sistemas Bluetooth y de Wi-Fi, las copias de seguridad y la seguridad permiten a las empresas administrar más aspectos el dispositivo. El registro de actividad de red ayuda a las empresas a realizar un seguimiento de los problemas.
Para obtener más información sobre estas y otras APIs y funciones nuevas de Android Enterprise, consulta Android en empresas.