Características y API de Android 8.0

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 a Activity.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étodo enterPictureInPictureMode() 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:

    Un menú de notificaciones de presión prolongada en Android 8.0 (nivel de API 26).

    Los usuarios pueden presionar de forma prolongada los íconos del selector de apps para ver las notificaciones en Android 8.0.

  • 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 intent Notification.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 y NOTIFICATION_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 clase NotificationListenerService.
  • 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 usar setColorized() 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 clase MessagingStyle para notificaciones relacionadas con la mensajería. También puedes usar Método addHistoricMessage() para proporcionar contexto a una conversación agregando mensajes históricos a las notificaciones relacionadas con la mensajería.

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:

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.

Actividad de ejemplo que incluye cinco clústeres de navegación que el usuario puede explorar usando la combinación de teclas de clúster de navegación por teclado. Los clústeres aparecen en la siguiente disposición: panel superior, panel lateral izquierdo, área de contenido principal, panel inferior y botón de acción flotante.
Figura 2: Actividad que contiene 5 clústeres de navegación

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:

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 implementan IntentService.
  • La biblioteca de compatibilidad de Android 26.0.0 presenta una nueva clase JobIntentService, que ofrece la misma funcionalidad que IntentService, 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 un ClipData 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 a Context.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:

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. Usa addTrack() 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:

Para obtener más información sobre cómo hacer que tu app sea más accesible, consulta Accesibilidad.

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étodo acceptRingingCall().
  • 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:

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 atributo android: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:

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.