Características y API de Android 8.0

Android 8.0 (nivel de API 26) introduce una variedad de y capacidades nuevas para usuarios y desarrolladores. En este documento, se destacan las novedades para desarrolladores.

Asegúrate de consultar también Cambios de comportamiento en Android 8.0 para obtener información sobre las áreas en las que cambia la plataforma podría 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). El 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 pausa la reproducción en su onPause(). controlador. En cambio, debes pausar el video en onStop() y reanudar la reproducción en onStart(). Para obtener más información, consulta Multiventana Lifecycle.

Para especificar que tu actividad puede usar el modo PIP, establece android:supportsPictureInPicture como verdadero en el manifiesto. (A partir de Android 8.0, PIP no requiere la Atributo android:resizeableActivity del manifiesto. Sin embargo, debes establecer android:resizeableActivity como "true" si tu actividad admite otras modos multiventana).

Android 8.0 (nivel de API 26) presenta un nuevo objeto, PictureInPictureParams, que pasas a métodos de PIP para especificar cómo debe comportarse una actividad. cuando están en 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 los especifica args. Si algún campo en args están vacíos, el sistema usa los valores establecidos la última vez que llamada Activity.setPictureInPictureParams().

    La actividad especificada se coloca en una esquina de la pantalla. el resto de la pantalla se llena con la actividad anterior que estaba en pantalla. La actividad que ingresa al modo PIP entra en un estado de pausa, pero permanece empezaste. Si el usuario presiona la actividad de PIP, el sistema muestra un menú para con el que el usuario interactúe; ningún evento táctil llega a la actividad mientras está en el estado de PIP.

  • Activity.setPictureInPictureParams(): Actualiza los ajustes de configuración de PIP de una actividad. Si la actividad es actualmente en modo de PIP, se actualiza la configuración; esto es útil si la relación de aspecto de la actividad. Si la actividad no está en modo PIP, estos parámetros de configuración se usan independientemente de la enterPictureInPictureMode() al que llames.

Notificaciones

En Android 8.0 (nivel de API 26), rediseñamos las notificaciones a proporcionan una forma más sencilla y coherente de administrar el comportamiento de las notificaciones. y configuración. 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 mantener presionados los íconos de selector de aplicaciones para ver en Android 8.0.

  • Canales de notificación: Presentación de Android 8.0 canales de notificaciones que te permiten crear un canal que el usuario puede personalizar para cada tipo de notificación que quieras mostrar. La interfaz de usuario se refiere a los canales de notificaciones como categorías de notificación. Para saber cómo hacerlo para implementar canales de notificación, consulta Gestionar 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.
  • Posposición: Los usuarios pueden posponer las notificaciones, lo que hace que desaparezcan. durante un tiempo antes de reaparecer. Las notificaciones vuelven a aparecer con el el mismo nivel de importancia con el que aparecieron por primera vez. Las apps pueden quitar o actualizar una notificación pospuesta, pero actualizar una notificación no causa para 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 setSettingsText() para configurar el texto que aparece cuando creas un vínculo al nombre de tu aplicación configuración de notificaciones desde una notificación 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.
  • Descarte de notificaciones: Los usuarios pueden descartar las notificaciones por sí mismos. las apps pueden quitarlos de manera programática. Puedes determinar cuándo una notificación se descarta y por qué se descarta implementando el 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. Para Por ejemplo, puedes establecer un color de fondo para las notificaciones relacionadas con rutas en auto o una llamada telefónica en curso. También puedes establecer el color de fondo deseado usando setColor() Hacerlo te permite usar setColorized() para habilitar el uso de un color de fondo para una notificación.
  • Estilo de mensajería: en Android 8.0, las notificaciones que usan Visualización de la clase MessagingStyle más contenido en su forma contraída. Deberías usar el MessagingStyle clase para notificaciones relacionadas con los mensajes. 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 con las apps que requieren estos tipos de apps 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 una vez 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 de Autofill Framework.

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 función nueva, Fuentes en XML, que te permite usar fuentes como recursos. Esto significa que no es necesario agrupar las 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 seguridad de tu app, incluyen la lo siguiente:

  • 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

Android 8.0 (nivel de API 26) incorpora la fijación de combinaciones de teclas en la app y widgets. 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 Cómo fijar accesos directos y widgets guía de funciones.

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 maxAspectRatio, que usar para establecer la relación de aspecto máxima de tu app. Además, en Android 8.0 y versiones posteriores, la imagen de una app La relación de aspecto máxima predeterminada 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 con varias pantallas. Si una actividad admite el modo multiventana y se está ejecutando en un dispositivo con varias pantallas, los usuarios pueden mover la actividad de una pantalla a otra. Cuando una app inicia una actividad, esta puede especificar en qué pantalla se debe ejecutar la actividad.

Nota: Si una actividad admite modo multiventana, Android 8.0 habilita automáticamente compatibilidad con varias pantallas para esa actividad. Debes probar tu app para asegurarte de que para asegurarte de que funcione correctamente en entornos multipantalla.

Solo se puede reanudar una actividad a la vez, aunque el estado la app tiene varias pantallas. La actividad con enfoque se encuentra en el estado de reanudación. todas las demás actividades visibles se pausarán, pero no se detendrán. Más información en el ciclo de vida de la actividad cuando varias actividades son visibles consulta Ventanas múltiples Lifecycle.

Cuando un usuario mueve una actividad de una pantalla a otra, el sistema Cambia el tamaño de la actividad y emite cambios en el tiempo de ejecución según sea necesario. Tu actividad puede manejar el cambio de configuración por sí mismo o permitir que el sistema destruirá el proceso que contiene tu actividad y recrearlo con el nuevo 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 en qué visualización se debe mostrar la actividad cuando se inicia.
getLaunchDisplayId()
Muestra la pantalla de inicio 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 dirección del texto, ten en cuenta que estos no afectan los valores de . layout_marginStart, layout_marginEnd, . paddingStart o . paddingEnd. Puedes establecer estos valores por tu cuenta, además de los nuevos atributos de diseño vertical y horizontal para crear el comportamiento del diseño que depende de la direcció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, una View en tu app puede solicitar captura del puntero y define un objeto de escucha para procesar los eventos del puntero capturados. El el puntero del mouse permanece oculto en este modo. La vista puede liberar la captura del puntero cuando ya no necesita la información del mouse. El sistema también puede liberar captura del 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 aplicación estableciendo la Atributo android:appCategory en tu <application> etiqueta del manifiesto.

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 contenido de video en filas correspondientes a los canales, que se completan con programas por una aplicación en el 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 los canales y programas que se propagan son parte de las APIs de TvProvider, que se distribuyen como Módulo de biblioteca de compatibilidad con Android 8.0.

AnimatorSet

A partir de Android 8.0 (nivel de API 26), la API de AnimatorSet admite la búsqueda y el juego en revertir. 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.

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

Para crear un elemento View o ViewGroup, sigue estos pasos: un clúster, configura android:keyboardNavigationCluster atribuye a true en el archivo en formato XML de diseño del elemento o pasa true. en setKeyboardNavigationCluster() en la lógica de la 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 trata a los clústeres ViewGroup 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 el enfoque “enfocado de forma predeterminada” parámetro, establece el valor de un elemento View el atributo android:focusedByDefault a true en el archivo en formato XML de diseño que contenga el elemento de la IU o pasa true a setFocusedByDefault() en tu la lógica de la IU de la app.

Salida de voz

Las actividades y los servicios pueden usar instancias TextToSpeech para dictar y pronunciar el contenido. Hasta el Android 8.0 (nivel de API 26), tu app puede obtener información más precisa sobre el tiempo cuando un motor de texto a voz comienza a leer palabras individuales sintetizadas siempre que el motor proporcione esa 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 un 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 comience la reproducción del audio de ese intervalo de texto, la onRangeStart() se ejecutan correctamente. Luego, tu app puede responder a esta devolución de llamada, por ejemplo, destacando el rango de texto asociado con el enunciado.

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 Ahora, la app recibe una cuota de espacio en disco para los datos almacenados en caché, como lo muestra getCacheQuotaBytes(UUID)

Cuando el sistema necesite liberar espacio en el disco, comenzará a borrar los archivos almacenados en caché de las apps que superan en máximo su cuota asignada. Por lo tanto, si mantienes los datos almacenados en caché cuota asignada, tus archivos almacenados en caché serán los últimos del sistema en eliminarse cuando 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 borrar archivos de un directorio, se trunquen a 0 bytes en del archivo, lo que deja intacto el archivo vacío.

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 que admitan la carga de un conjunto de datos, una página a la vez. Por ejemplo, una aplicación de fotos con miles de las imágenes pueden consultar un subconjunto de datos para presentar en una página. Cada página de los resultados que muestra un proveedor de contenido se representa con un solo cursor . Tanto un cliente como un proveedor deben implementar 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.

Tu app cliente puede solicitar de forma explícita contenido actualizado llamando a un otro método, 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 un trabajo, llamar 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 anteriormente habrían se recurrió al inicio de un servicio en segundo plano, en particular, aquellos que implementan IntentService
  • En Android La biblioteca de compatibilidad 26.0.0 presenta una nueva clase JobIntentService, que proporciona lo mismo funcionalidad como IntentService, pero usa trabajos en lugar de servicios cuando se ejecuta en Android 8.0 (nivel de API 26) o versiones posteriores.
  • Ya puedes llamar JobInfo.Builder.setClipData() para asociar un ClipData con un trabajo. Esta opción permite asociar otorgamientos de permisos de URI con un trabajo, de manera similar a como estos los permisos se pueden propagar a Context.startService(). También puedes usar otorgamientos de permisos de URI con intents en las colas de trabajo.
  • Los trabajos programados ahora admiten 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
    El trabajo requiere una conexión de red de uso medido, como la mayoría de los datos móviles. de los planes de negocios de los socios.

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 en el 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. Usar esta clase como parámetro de requestAudioFocus(), Las apps tienen nuevas capacidades a la hora de controlar cambios en el foco de audio: disminución automática de volumen y obtención demorada del 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 la vida útil de la instancia. 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 introduce un nuevo software seekTo() que proporciona un control detallado cuando busques 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 de teclas). asociados con una fuente de datos que se encuentra justo antes o en un momento determinado.
  • SEEK_NEXT_SYNC mueve la posición del contenido multimedia a un fotograma de sincronización (o de teclas) asociado. con una fuente de datos que se encuentra inmediatamente después o en el momento dado.
  • SEEK_CLOSEST_SYNC mueve la posición del contenido multimedia a un fotograma de sincronización (o de teclas). asociados con una fuente de datos que se encuentra más cerca o en un momento determinado.
  • SEEK_CLOSEST mueve la posición del contenido multimedia a un fotograma (no es necesariamente una sincronización). o fotograma clave) asociados con una fuente de datos que se encuentra más cerca en un momento dado.

Cuando se realiza una búsqueda continua, las apps deben usar cualquiera de los modos SEEK_ en lugar de SEEK_CLOSEST, que se ejecuta relativamente más lento, 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

  • El MediaMuxer ahora puede manejar 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 quieras.
  • El MediaMuxer también puede agregar una o más pistas de metadatos que contengan por fotograma definido por el usuario información. 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 de el sensor se podría usar 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 una ByteBuffer por una marca de tiempo asociada al 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 la pista de metadatos, el MIME formato de los metadatos se extraerá 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 grandes archivos multimedia desde una fuente de datos remota presenta algunas 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 acceso al almacenamiento de Google Cloud.

Proveedores de documentos personalizados

A partir de Android 8.0, el framework de acceso al almacenamiento permite documentos personalizados proveedores para crear descriptores de archivos que admitan búsquedas para los archivos que se alojen en una una fuente de datos remota. El SAF puede abrir un archivo para obtener un archivo nativo que admita búsquedas. descriptor de la aplicación. Luego, el SAF entrega solicitudes de bytes discretas a los documentos. proveedor. Esta función permite que un proveedor de documentos devuelva el rango exacto de bytes que solicitó una app de reproducción multimedia, en lugar de almacenar en caché toda la que se puede enviar un archivo con anticipación.

Para usar esta función, debes llamar al nuevo 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 devuelto está respaldado por un DocumentsProvider, los administradores de colecciones multimedia pueden acceder el documento directamente, sin tener que recorrer á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 busca archivos multimedia. no otorga permiso a las apps permiso para acceder a esos archivos. Si deseas obtener más información para obtener acceso 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 la función "Guardar como" que muestra la ubicación de una documento en particular.
  • Tu app muestra carpetas en una vista de resultados de búsqueda y debe cargar el elemento secundario documentos que se encuentran dentro de una carpeta en particular si el usuario selecciona que carpeta.

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, sigue estos pasos: llamar a registerAudioPlaybackCallback() y pasar una instancia de AudioManager.AudioPlaybackCallback El La clase AudioManager.AudioPlaybackCallback contiene las onPlaybackConfigChanged() al que llama el sistema cuando el audio cambios en la configuración de reproducción

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 dispositivos con las funciones El hardware de reconocimiento de Wi-Fi, las apps y los dispositivos cercanos pueden descubrir y comunicarse a través de Wi-Fi sin un punto de acceso a Internet. Estamos trabajando con nuestro hardware y socios llevar la tecnología de reconocimiento de Wi-Fi a los dispositivos lo antes posible. Para 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 APIs que te permiten personalizar la Diálogo de solicitud de vinculación cuando se intenta vincular con dispositivos complementarios 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 Bluetooth. Para cambios específicos de Bluetooth para Android 8.0 (nivel de API 26), consulta el sección Bluetooth de la Página Cambios de comportamiento en 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 aplicación de seguimiento de gastos. Si el usuario se toma una selfie, cómo la app 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 los tipos de contenido que no sean image, como audio, video, text y 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 describen los componentes o temas principales del contenido. 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 se string coincide con un tipo de entidad clasificador conocido y obtiene una selección sugerida alternativas. 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:

Si quieres obtener más información para mejorar la accesibilidad de tu app, consulta Accesibilidad.

Seguridad y privacidad

Permisos

Android 8.0 (nivel de API 26) presenta varios permisos nuevos relacionados con la telefonía:

Estos permisos se clasifican como peligroso y ambos forman parte del PHONE grupo de permisos.

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. En las cuentas que administra, los autenticadores pueden usar su propia política para decidir si ocultarán las cuentas, o revelar cuentas a una aplicación. El sistema Android realiza un seguimiento de las aplicaciones que pueden acceder a una cuenta determinada.

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) incluye dos valores de nombre de paquete especiales para especificar la visibilidad para las aplicaciones que no se establecieron con el setAccountVisibility(android.accounts.Account, java.lang.String, int) . El PACKAGE_NAME_KEY_LEGACY_VISIBLE el valor de visibilidad se aplica a las apps que tienen la GET_ACCOUNTS permiso y versiones de destino Un dispositivo Android anterior a Android 8.0 o una versión coinciden con el autenticador dirigido a cualquier versión de Android. PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE proporciona un valor de visibilidad predeterminado para que no se configuraron y para las que PACKAGE_NAME_KEY_LEGACY_VISIBLE no es que corresponda.

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 aplicaciones y pruebas de instrumentación.

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 a tu manifiesto y, luego, al nivel deseado elemento <instrumentation>. Agrega el android:targetProcess y establecer su valor en uno de lo siguiente:

  • el nombre de un proceso en particular;
  • una lista de nombres de procesos separados por comas;
  • Un comodín ("*"), que permite que se ejecute la instrumentación contra cualquier proceso iniciado 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 mientras se ejecuta tu prueba de instrumentación. en lugar de después, 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 la clase de prueba invoca el intent, el método muestra un stub Instrumentation.ActivityResult en lugar de ejecutarlo el intent en sí. Si usas esta lógica de intent ficticio en tus pruebas, puedes enfocarte sobre cómo tu actividad prepara y maneja la intent que pasas a una a una actividad diferente o a una app completamente diferente.

Tiempo de ejecución y Herramientas

Optimizaciones de plataforma

Android 8.0 (nivel de API 26) incorpora optimizaciones de tiempo de ejecución y otras optimizaciones a la plataforma que se traducen en una serie de mejoras en el rendimiento. Estas optimizaciones incluyen la recolección de elementos no utilizados de compactación simultánea un uso más eficiente de la memoria y la localidad del código.

Estas optimizaciones generan tiempos de inicio más rápidos y un mejor rendimiento tanto en SO y apps.

Se actualizó la compatibilidad con el lenguaje Java.

Android 8.0 (nivel de API 26) incorpora 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 el Framework de ICU4J para Android APIs (un subconjunto de las APIs de ICU4J) para que los desarrolladores de apps usar en el paquete android.icu. Estas APIs usan datos de localización presentes en el dispositivo, de modo que puedas reducir la huella del APK al no compilar la ICU4J en tu 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 introdujeron nuevas funciones y APIs empresariales para los dispositivos que ejecutan Android 8.0 (nivel de API 26) Entre los aspectos destacados, se incluyen los siguientes:

  • Los perfiles de trabajo en dispositivos completamente administrados permiten que las empresas separen el trabajo del datos personales y administrar ambos.
  • La delegación de API permite a los propietarios de dispositivos y perfiles asignar la app la 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 nuevos controles de Bluetooth, Wi-Fi, copias de seguridad y seguridad permiten que las empresas administrar más aspectos del dispositivo. Los registros de actividad de red ayudan a las empresas a hacer un seguimiento problemas.

Para obtener más información sobre estas y otras APIs y funciones nuevas de Android Enterprise, consulta Android en empresas.