Ya está disponible Media3 1.11. Esta versión, que impulsa la gran mayoría de las principales apps de contenido multimedia para Android, incluye funciones nuevas, correcciones de errores y mejoras en los componentes de reproducción, edición y de la IU. Estamos expandiendo nuestros módulos de la IU de Jetpack Compose con ranuras personalizables Player y valores predeterminados fáciles de usar, gestos interactivos, observadores de estado y carga previa de videos de formato corto con PlayerPool. También modernizamos la integración de Media3 Cast con compatibilidad con el selector de salida de SystemUI, presentamos una nueva extensión de red de cliente HTTP de Ktor y agregamos nuevas utilidades de multiplexación para archivos Ogg y WAV.
Sigue leyendo para conocer los aspectos más destacados y consulta las notas de la versión completas para obtener una lista exhaustiva de los cambios.
IU de reproducción y Compose
A medida que Android se convierte en Compose-first, seguimos expandiendo los módulos media3-ui-compose y media3-ui-compose-material3. Esta actualización introduce un control más detallado sobre el diseño del reproductor, patrones de interacción más enriquecidos y una integración más profunda con Material3.
Diseño de reproductor personalizable
El elemento componible Player de Material 3 ahora admite ranuras de contenido dedicadas para topControls, centerControls, bottomControls y errorOverlay. Puedes colocar tus propios elementos componibles o usar los valores predeterminados listos para usar publicados en PlayerDefaults:
Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, )
El elemento componible Player también integra la compatibilidad con FocusRequester, lo que permite una navegación fluida con el pad direccional y el teclado en Android TV, dispositivos plegables y entornos de escritorio.
Gestos y control de velocidad de reproducción
PlaybackSpeedState ahora proporciona una API de avance rápido y cámara lenta. El demo-compose app muestra esto con un gesto de presión prolongada para avanzar rápidamente la reproducción y buscar con un doble toque. En combinación con ProgressSlider introducido en 1.10, la IU del reproductor de Compose ahora ofrece interacciones táctiles y de gestos enriquecidas listas para usar.
Carga previa de videos de formato corto con PlayerPool
Para las apps con feeds de contenido multimedia de ventana deslizante (por ejemplo, videos verticales de formato corto), administrar varias instancias de ExoPlayer de manera eficiente es un desafío común. Media3 1.11 introduce PlayerPool (en common-ktx) y rememberPooledPlayer (en ui-compose) para controlar el reciclaje y la carga previa del reproductor automáticamente.
El nuevo ShortFormPlayerScreen en demo-compose muestra esto en acción, un feed de paginación vertical en el que los reproductores se agrupan, se cargan previamente y se reciclan sin problemas a medida que el usuario se desplaza.
MiniController
Un nuevo elemento componible MiniController en media3-ui-compose-material3 proporciona una barra de reproducción compacta que muestra el título, el artista, la ilustración y el progreso del elemento actual junto con los controles de reproducción y pausa. Como todos nuestros elementos componibles predeterminados en media3-ui-compose-material3, MiniController admite la integración de color dinámico de Material3, lo que le permite adaptarse automáticamente al tema de fondo de pantalla del usuario.Esto es ideal para las funciones persistentes de hoja inferior o reproductor en miniatura, por ejemplo, mientras el usuario navega por el contenido o durante las sesiones de Cast activas.
Titulares de estado expandidos para metadatos y errores
Agregamos varios titulares de estado reactivos nuevos a media3-ui-compose:
rememberCurrentMediaItemState: Observa los metadatos sobre el elemento que se está reproduciendo.rememberPlaylistState: Observa la playlist completa y los índices activos.rememberErrorState: Realiza un seguimiento de los errores de reproducción, con un elemento componibleErrorTextcoincidente yErrorOverlaypredeterminado en Material3.
Seguiremos trabajando en nuevas incorporaciones y más opciones de personalización en las próximas versiones. Comparte tus opiniones en el seguimiento de errores del proyecto.
Integración de Cast modernizada
Media3 1.11 actualiza la extensión de Cast con opciones de configuración programática y compatibilidad con el enrutamiento a nivel del SO.
CastParams y selector de salida de SystemUI
Ahora puedes configurar la extensión de Cast con CastParams:
val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams)
Si configuras setShowSystemOutputSwitcherOnCastIconClick(true), se configura MediaRouteButton para abrir el selector de salida de SystemUI nativo de Android en las versiones de plataforma compatibles, lo que proporciona una experiencia unificada de selector de salida.
Estado reactivo de MediaRouteButton en Compose
Las apps que usan Jetpack Compose ahora pueden agregar fácilmente el botón para transmitir (también conocido como botón de Cast), que observa automáticamente el estado del diálogo y se actualiza en consecuencia. No se necesita más lógica cuando se usa junto con CastPlayer de Media3.
@Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } }
Mejoras principales de la reproducción y la sesión
Video de Eclipsa: Metadatos HDR dinámicos de HAGC (API 37+)
Video de Eclipsa promete una experiencia HDR más coherente en todos los dispositivos, con un blanco HDR de referencia coherente, un margen de maniobra adaptable según la pantalla y el entorno, lo que garantiza que la intención creativa se conserve en todos los dispositivos.
ExoPlayer ahora admite la reproducción de los metadatos temporizados de HAGC (ST 2094-50) necesarios para el contenido multimedia progresivo (MP4, Matroska). El reproductor combina automáticamente las pistas de metadatos de HAGC con la pista de video asociada y entrega los metadatos fuera de banda al decodificador en dispositivos con API 37+. En dispositivos más antiguos, ExoPlayer recurre sin problemas a proporcionar una experiencia de reproducción HDR estándar sin los ajustes.
Nueva extensión de cliente HTTP de Ktor
Un nuevo media3-datasource-ktor módulo de extensión proporciona KtorDataSource, respaldado por la pila HTTP de Ktor. Esto ofrece una alternativa de Kotlin-first y compatible con corrutinas a los módulos de fuente de datos Cronet y OkHttp existentes.
Conexiones asíncronas de MediaSession
MediaSession.Callback ahora incluye onConnectAsync(), que te permite procesar los intentos de conexión del controlador de forma asíncrona, por ejemplo, para verificar la autorización antes de aceptar una conexión. Puedes mostrar un Future inmediato con Futures.immediateFuture(ConnectionResult) para el mismo comportamiento que el onConnect existente.
override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture<MediaSession.ConnectionResult> { return authenticateControllerAsync(controller) }
Valores predeterminados de MediaSession más seguros
Para las apps que no anulan onConnect ni onConnectAsync en MediaSession.Callback, la biblioteca ahora usa una configuración más segura de forma predeterminada. En particular, los datos de la sesión ya no se comparten de forma predeterminada con los controladores no confiables, lo que significa que las apps de terceros o que no son del sistema que no tienen acceso a las notificaciones tienen restringido el acceso a los datos de la sesión, a menos que implementes explícitamente estos métodos de devolución de llamada para autorizar la conexión.
Nuevas implementaciones de Muxer y análisis de contenedores
OggMuxer y WavMuxer
Agregamos dos nuevos multiplexores dedicados: OggMuxer para multiplexar transmisiones OPUS y VORBIS en archivos .ogg estándar, y WavMuxer para generar archivos de audio .wav PCM sin comprimir y de punto flotante.
Análisis de contenedores y referencias de pistas
- Referencias de pistas MP4 (
tref):Mp4Muxer.addTrackReferencepermite vincular metadatos dependientes o pistas auxiliares a transmisiones de video principales. - Extracción de capítulos: Los capítulos de QuickTime y Nero de archivos MP4 (
.m4a,.m4b) y los capítulos de Matroska ahora se extraen como entradas de metadatosChapterpara la navegación de audiolibros y podcasts.
Usa el seguimiento de errores para informar errores o si tienes preguntas o solicitudes de funciones. Esperamos noticias tuyas.
-
GuíasTe damos la bienvenida de nuevo a la serie de entradas de blog "Compila apps inteligentes para Android", en la que tomamos una app básica para Android y la transformamos en una experiencia personalizada, inteligente y de agente. En nuestra entrada anterior, presentamos Jetpacker, la app de demostración que usaremos en esta serie.
Caren Chang • Lectura de 6 min -
GuíasJetpacker es una app de demostración técnica que nuestro equipo creó desde cero para el Google I/O de este año (creada con Antigravity). En esencia, Jetpacker ayuda a los usuarios a planificar, explorar y disfrutar de su próxima gran aventura.
Jolanda Verhoef • Lectura de 4 min -
GuíasTe damos la bienvenida de nuevo a la serie de entradas de blog "Compila apps inteligentes para Android", en la que tomamos una app básica para Android y la transformamos en una experiencia personalizada, inteligente y de agente. En nuestra entrada anterior, exploramos cómo aprovechar Firebase AI Logic para compilar funciones de IA híbridas y alojadas en la nube.
Ben Weiss • Lectura de 6 min
Recibe la información más reciente sobre el desarrollo de Android en tu bandeja de entrada todas las semanas.