O Media3 1.11 já está disponível. Com tecnologia para a grande maioria dos principais apps de mídia do Android, essa versão traz novos recursos, correções de bugs e melhorias em componentes de reprodução, edição e interface. Estamos expandindo nossos módulos de interface do Jetpack Compose com slots personalizáveis Player e padrões fáceis de usar, gestos interativos, observadores de estado e pré-carregamento de vídeos curtos usando PlayerPool. Também modernizamos a integração do Media3 Cast com suporte ao seletor de saída do SystemUI, introduzimos uma nova extensão de rede de cliente HTTP Ktor e adicionamos novos utilitários de multiplexação para arquivos Ogg e WAV.
Leia mais para conferir os principais destaques e as notas de lançamento completas para uma lista abrangente de mudanças.
Interface de reprodução e Compose
Com o Android se tornando o Compose-first, continuamos a expandir os módulos media3-ui-compose e media3-ui-compose-material3. Essa atualização apresenta um controle mais granular sobre o layout do player, padrões de interação mais avançados e uma integração mais profunda com o Material3.
Layout do player personalizável
O Material 3 Player Composable agora oferece suporte a slots de conteúdo dedicados para topControls, centerControls, bottomControls e errorOverlay. Você pode inserir seus próprios Composables ou usar os padrões prontos publicados em PlayerDefaults:
Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, )
O Composable Player também integra o suporte FocusRequester, permitindo a navegação perfeita com botão direcional e teclado em ambientes Android TV, dobráveis e de computadores.
Gestos e controle de velocidade do vídeo
PlaybackSpeedState agora oferece uma API de avanço rápido/câmera lenta. O demo-compose app mostra isso com um gesto de toque longo para avançar a reprodução e a busca com toque duplo. Combinada com o ProgressSlider introduzido na versão 1.10, a interface do player do Compose agora oferece interações avançadas de toque e gesto.
Pré-carregamento de vídeos curtos com PlayerPool
Para apps com feeds de mídia de janela deslizante (por exemplo, vídeos verticais curtos), o gerenciamento eficiente de várias instâncias ExoPlayer é um desafio comum. O Media3 1.11 apresenta PlayerPool (em common-ktx) e rememberPooledPlayer (em ui-compose) para processar a reciclagem e o pré-carregamento do player automaticamente.
O novo ShortFormPlayerScreen em demo-compose mostra isso em ação, um feed de paginação vertical em que os players são agrupados, pré-carregados e reciclados perfeitamente à medida que o usuário rola a tela.
MiniController
Um novo Composable MiniController em media3-ui-compose-material3 oferece uma barra de reprodução compacta que mostra o título, o artista, a arte e o progresso do item atual, além dos controles de reprodução/pausa. Como todos os nossos Composables padrão em media3-ui-compose-material3, o MiniController oferece suporte à integração de cores dinâmicas do Material3, permitindo que ele se adapte automaticamente ao tema do plano de fundo do usuário.Isso é ideal para recursos persistentes de folha inferior ou miniplayer, por exemplo, enquanto o usuário navega pelo conteúdo ou durante sessões ativas do Cast.
Titulares de estado expandidos para metadados e erros
Adicionamos vários novos titulares de estado reativos ao media3-ui-compose:
rememberCurrentMediaItemState: observa os metadados sobre o item em reprodução.rememberPlaylistState: observa a playlist completa e os índices ativos.rememberErrorState: rastreia erros de reprodução, com um ComposableErrorTextcorrespondente eErrorOverlaypadrão no Material3.
Vamos continuar trabalhando em novas adições e mais opções de personalização em versões futuras. Compartilhe sua opinião no Issue Tracker do projeto.
Integração modernizada do Cast
O Media3 1.11 atualiza a extensão do Cast com opções de configuração programática e suporte ao roteamento no nível do SO.
CastParams e seletor de saída do SystemUI
Agora é possível configurar a extensão do Cast usando CastParams:
val castParams = CastParams.Builder() .setShowSystemOutputSwitcherOnCastButtonClick(true) .build() Cast.getSingletonInstance(context).initialize(castParams)
A configuração de setShowSystemOutputSwitcherOnCastIconClick(true) configura o MediaRouteButton para abrir o seletor de saída do SystemUI nativo do Android em versões de plataforma compatíveis, oferecendo uma experiência unificada de seleção de saída.
Estado reativo do MediaRouteButton no Compose
Os apps que usam o Jetpack Compose agora podem adicionar facilmente o botão de roteamento de mídia (também conhecido como botão Transmitir), que observa automaticamente o estado da caixa de diálogo e é atualizado de acordo. Nenhuma outra lógica é necessária quando usado com o CastPlayer do Media3.
@Composable fun TopAppBarWithCast() { Row { Text(text = "App Title") MediaRouteButton() } }
Melhorias na reprodução e na sessão principais
Eclipsa Video: metadados HDR dinâmicos do HAGC (API 37 e mais recentes)
O Eclipsa Video promete uma experiência HDR mais consistente em todos os dispositivos, com um branco HDR de linha de base consistente, headroom adaptável dependendo da tela e do ambiente, garantindo que a intenção criativa seja preservada em todos os dispositivos.
O ExoPlayer agora oferece suporte à reprodução dos metadados temporizados necessários do HAGC (ST 2094-50) para mídia progressiva (MP4, Matroska). O player mescla automaticamente as faixas de metadados do HAGC com a faixa de vídeo associada e entrega os metadados fora da banda ao decodificador em dispositivos com a API 37 e mais recentes. Em dispositivos mais antigos, o ExoPlayer volta a oferecer uma experiência de reprodução HDR padrão sem os ajustes.
Nova extensão de cliente HTTP Ktor
Um novo media3-datasource-ktor módulo de extensão fornece KtorDataSource, com tecnologia da pilha HTTP Ktor. Isso oferece uma alternativa Kotlin-first e compatível com corrotinas aos módulos de fonte de dados Cronet e OkHttp.
Conexões MediaSession assíncronas
MediaSession.Callback agora inclui onConnectAsync(), que permite processar tentativas de conexão do controlador de forma assíncrona, por exemplo, para verificar a autorização antes de aceitar uma conexão. Você pode retornar um Future imediato com Futures.immediateFuture(ConnectionResult) para o mesmo comportamento do onConnect atual.
override fun onConnectAsync( session: MediaSession, controller: MediaSession.ControllerInfo ): ListenableFuture<MediaSession.ConnectionResult> { return authenticateControllerAsync(controller) }
Padrões MediaSession mais seguros
Para apps que não substituem onConnect ou onConnectAsync em MediaSession.Callback, a biblioteca agora usa uma configuração mais segura por padrão. Especificamente, os dados da sessão não são mais compartilhados por padrão com controladores não confiáveis, o que significa que apps de terceiros ou não relacionados ao sistema que não têm acesso a notificações são restritos de acessar dados da sessão, a menos que você implemente explicitamente esses métodos de callback para autorizar a conexão.
Novas implementações de muxer e análise de contêiner
OggMuxer e WavMuxer
Adicionamos dois novos muxers dedicados: OggMuxer para multiplexar streams OPUS e VORBIS em arquivos .ogg padrão e WavMuxer para gerar arquivos de áudio PCM .wav não compactados e de ponto flutuante.
Análise de contêiner e referências de faixa
- Referências de faixa MP4 (
tref):Mp4Muxer.addTrackReferencepermite vincular metadados dependentes ou faixas auxiliares a streams de vídeo principais. - Extração de capítulos:os capítulos QuickTime e Nero de arquivos MP4 (
.m4a,.m4b) e os capítulos Matroska agora são extraídos como entradas de metadadosChapterpara navegação em audiolivros e podcasts.
Use o Issue Tracker para informar bugs ou se tiver dúvidas ou solicitações de recursos. Esperamos você!
-
TutoriaisBem-vindo de volta à série de postagens do blog "Criar apps Android inteligentes", em que transformamos um app Android básico em uma experiência personalizada, inteligente e de agente. Na postagem anterior, apresentamos o Jetpacker, o app de demonstração que vamos usar nesta série.
Caren Chang • Leitura de 6 minutos -
TutoriaisO Jetpacker é um app de demonstração técnica que nossa equipe criou do zero para o Google I/O deste ano (criado usando o Antigravity). Basicamente, o Jetpacker ajuda os usuários a planejar, explorar e aproveitar a próxima grande aventura.
Jolanda Verhoef • Leitura de 4 minutos -
TutoriaisBem-vindo de volta à série de postagens do blog "Criar apps Android inteligentes", em que transformamos um app Android básico em uma experiência personalizada, inteligente e de agente. Na postagem anterior, mostramos como aproveitar o Firebase AI Logic para criar recursos de IA híbridos e hospedados na nuvem.
Ben Weiss • Leitura de 6 minutos
Receba as informações mais recentes sobre o desenvolvimento do Android na sua caixa de entrada semanalmente.