A versão 1.11 do Media3 está disponível. Essa atualização traz novos recursos, correções de bugs e melhorias em todos os componentes de reprodução, edição e interface do usuário (UI). Estamos expandindo nossos módulos Jetpack Compose UI com slots personalizáveis Player, padrões fáceis de usar, interações gestuais, observadores de estado e pré-carregamento de vídeos curtos usando PlayerPool. Também modernizamos a integração Media3 Cast com suporte ao Switcher de Saída do SystemUI, introduzimos uma nova extensão HTTP cliente Ktor e adicionamos novas utilidades de multiplexação para arquivos Ogg e WAV.
Saiba mais sobre os destaques principais e confira a lista completa de alterações no relatório de lançamento.
Interface do Usuário (UI) de Reprodução e Compose
A medida que o Android se torna cada vez mais baseado em Compose, estamos expandindo continuamente os módulos media3-ui-compose e media3-ui-compose-material3. Esta atualização introduz um controle mais granular sobre a sua configuração de layout do player, padrões interativos mais ricos e uma integração mais profunda com Material3.
Layout personalizável do Player
A composição do Player do Material 3 agora suporta espaços dedicados para topControls, centerControls, bottomControls e errorOverlay. Você pode inserir seus próprios Composables ou usar os padrões prontos para uso publicados em PlayerDefaults:
Player(
player = player,
topControls = { PlayerDefaults.TopControls(player) },
centerControls = { PlayerDefaults.CenterControls(player) },
bottomControls = { PlayerDefaults.BottomControls(player) },
)
A composição Player também integra o suporte ao FocusRequester, permitindo a navegação sem problemas com D-pad e teclado em dispositivos Android TV, dobráveis e ambientes de desktop.
Gestos e controle da velocidade de reprodução
O PlaybackSpeedState agora fornece uma API para avanço rápido/vídeo em câmera lenta. A aplicação demo-compose ilustra isso com um gesto de long-press para avançar a reprodução e procurar com duplo toque. Combinado com o ProgressSlider introduzido na versão 1.10, a interface do usuário do player Compose agora oferece interações ricas por toque e gesto prontas para uso.
Pré-carregamento de vídeos curtos com PlayerPool
Para aplicativos com feeds de mídia em janelas deslizantes (por exemplo, vídeos verticais curtos), gerenciar eficientemente várias instâncias do ExoPlayer é um desafio comum. A versão 1.11 do Media3 introduz PlayerPool (em common-ktx) e rememberPooledPlayer (em ui-compose) para lidar automaticamente com o reciclagem de jogadores e pré-carregamento.
O novo ShortFormPlayerScreen em demo-compose mostra isso em ação, um feed verticalmente paginado onde os jogadores são empilhados, pré-carregados e reciclados automaticamente enquanto o usuário rola.
MiniController
Um novo Composable MiniController no media3-ui-compose-material3 fornece uma barra de reprodução compacta exibindo o título, artista, arte e progresso do item atual ao lado dos controles play/pause. Como todos os nossos padrões Composables em media3-ui-compose-material3, o MiniController suporta a integração de cores dinâmicas Material3, permitindo que ele se adapte automaticamente ao tema da parede de fundo do usuário. Isso é ideal para ofertas persistentes de bottom-sheet ou mini-player, por exemplo enquanto o usuário navega em conteúdo ou durante sessões ativas Cast.
Holders de estado expandidos para metadados e erros
Adicionamos vários novos holders de estado reativos a media3-ui-compose:
rememberCurrentMediaItemState– observe os metadados sobre o item atualmente tocandorememberPlaylistState– observe a lista completa de reprodução e índices ativosrememberErrorState– acompanhe erros de reprodução, com umErrorTextComposable correspondente e uma sobreposição padrãoErrorOverlayno Material3
Vamos continuar trabalhando em novas adições e mais opções de personalização nas próximas versões. Por favor, compartilhe suas ideias na página de problemas do projeto.
Integração modernizada com Cast
A versão 1.11 do Media3 atualiza a extensão Cast com opções de configuração programática e suporte para roteamento no nível do sistema operacional.
CastParams e SystemUI Output Switcher
Você pode agora configurar a extensão Cast usando CastParams:
val castParams = CastParams.Builder()
.setShowSystemOutputSwitcherOnCastButtonClick(true)
.build()
Cast.getSingletonInstance(context).initialize(castParams)
A configuração setShowSystemOutputSwitcherOnCastIconClick(true) define o botão de roteamento da mídia para abrir a janela nativa do Android SystemUI Output Switcher em versões de plataforma compatíveis, fornecendo uma experiência unificada de seleção de saída.
Efetivo estado do MediaRouteButton no Compose
Os aplicativos que usam Jetpack Compose podem agora adicionar facilmente o botão de roteamento da mídia (também conhecido como botão Cast), que automaticamente observa o estado da janela modal e atualiza conforme necessário. Nenhuma lógica adicional é necessária quando usado junto com CastPlayer do Media3!
@Composable
fun TopAppBarWithCast() {
Row {
Text(text = "App Title")
MediaRouteButton()
}
}
Botão de roteamento da mídia do Media3 em um aplicativo lançando a janela padrão de seleção de saídaAprimoramentos no toque e na sessão de reprodução
Eclipsa Video - HAGC metadados dinâmicos HDR (API 37+)
O Eclipsa Video promete uma experiência HDR mais consistente em dispositivos, com um branco HDR de base consistente, espaço dinâmico adaptativo dependendo da tela e do ambiente, garantindo que a intenção criativa seja preservada em todos os dispositivos.
O ExoPlayer agora suporta a reprodução dos metadados necessários HAGC (ST 2094-50) para mídia progressiva (MP4, Matroska). O player mescla automaticamente os trilhos de metadados HAGC com o trilha de vídeo associada e entrega o metadado fora da banda ao decodificador em dispositivos API 37+. Em dispositivos mais antigos, o ExoPlayer cai suavemente para fornecer uma experiência padrão de reprodução HDR sem as ajustes.
Ilustração mostrando os benefícios do Eclipsa Video HDR, como um contrato de cor mais consistente
Nova extensão do cliente HTTP Ktor
Uma nova módulo de extensão media3-datasource-ktor fornece o KtorDataSource, baseado na pilha HTTP Ktor. Isso oferece uma alternativa orientada para Kotlin e amigável a coroutines para os módulos de fonte de dados existentes Cronet e OkHttp.
Conexões assíncronas do MediaSession
O MediaSession.Callback agora inclui o método onConnectAsync(), que permite processar tentativas de conexão de controladores 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 existente onConnect.
override fun onConnectAsync(
session: MediaSession,
controller: MediaSession.ControllerInfo
): ListenableFuture<MediaSession.ConnectionResult> {
return authenticateControllerAsync(controller)
}
Melhorias de segurança nas configurações padrão do MediaSession
Para aplicativos que não sobrescrevem onConnect ou onConnectAsync em MediaSession.Callback, a biblioteca agora usa uma configuração mais segura por padrão. Especificamente, os dados da sessão já não são compartilhados por padrão com controladores não confiáveis, o que significa que aplicativos de terceiros ou não do sistema sem acesso às notificações estão restritos a acessar os dados da sessão a menos que você implemente explicitamente esses métodos de retorno de chamada 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 mesclar fluxos OPUS e VORBIS em arquivos .ogg padrão, e WavMuxer para gerar arquivos de áudio .wav sem compressão e ponto flutuante PCM.
Análise de contêiner e referências de faixas
- Referências de faixa MP4 (tref):
Mp4Muxer.addTrackReferencepermite vincular metadados ou faixas auxiliares dependentes a fluxos de vídeo primários. - Extração de capítulos: Capítulos QuickTime e Nero de arquivos MP4 (.m4a, .m4b) e capítulos Matroska são extraídos como entradas de metadados de capítulo para navegação em livros de áudio e podcasts.
Por favor, use o rastreador de problemas para relatar quaisquer bugs ou se você tiver perguntas ou solicitações de recursos. Estamos ansiosos para ouvir de você!



