Um controlador de mídia interage com uma sessão para consultar e controlar uma mídia.
a reprodução do app. Na Media3, a classe MediaController
A API implementa a interface Player
. Exemplos de apps clientes que usam uma interface de mídia
incluem:
- Controles de mídia do sistema Android
- App complementar do Android Wear OS
- Android Auto e Automotive OS
- Assistentes de voz, como o Google Assistente
- O app de teste do controle de mídia
Um controlador de mídia também pode ser útil em um app de mídia, por exemplo, se o
player de vídeo e sessão de mídia ao vivo em um Service
separado do Activity
ou
Fragment
com a IU.
Criar um MediaController
.
Para criar um MediaController
, comece criando um SessionToken
para o
o MediaSession
correspondente. O método onStart()
da classe Activity
ou
Fragment
pode ser um bom lugar para isso.
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
Java
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
O uso desse SessionToken
para criar um MediaController
conecta o
controlador a uma determinada sessão. Isso ocorre de forma assíncrona. Portanto,
ouvir o resultado e usá-lo quando disponível.
Kotlin
val controllerFuture = MediaController.Builder(context, sessionToken).buildAsync() controllerFuture.addListener({ // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor())
Java
ListenableFuture<MediaController> controllerFuture = new MediaController.Builder(context, sessionToken).buildAsync(); controllerFuture.addListener(() -> { // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor());
Usar um MediaController
MediaController
implementa a interface Player
, para que você possa usar os comandos.
definido na interface para controlar a reprodução do MediaSession
conectado.
Isso significa que chamar play()
em uma MediaController
enviará a
ao MediaSession
conectado, que delegará o comando
ao Player
subjacente.
Da mesma forma, você pode adicionar um Player.Listener
ao controlador para detectar
muda no estado Player
. Consulte a
Guia de eventos de jogadores
para mais detalhes sobre como usar um Player.Listener
. O MediaController.Listener
define retornos de chamada adicionais para eventos e comandos de entrada da
MediaSession
conectado, como
onAvailableSessionCommandsChanged()
para quando a sessão de mídia altera os comandos de sessão disponíveis e
onDisconnected()
para quando o controlador é desconectado da sessão.
Assim como em outros componentes, lembre-se de liberar a MediaController
quando ela estiver
não são mais necessários, como no método onStop()
de um Activity
ou
Fragment
.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Liberar o controlador ainda entregará todos os comandos pendentes enviados ao sessão e só se desvinculem do serviço de sessão quando esses comandos forem ou após um tempo limite, o que ocorrer primeiro.
Criar e usar um MediaBrowser
Um MediaBrowser
se baseia nos recursos oferecidos por uma
MediaController
para também ativar a navegação na biblioteca de mídia oferecida por uma mídia
MediaLibraryService
do app.
Kotlin
val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync() browserFuture.addListener({ // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor())
Java
ListenableFuture<MediaBrowser> browserFuture = new MediaBrowser.Builder(context, sessionToken).buildAsync(); browserFuture.addListener(() -> { // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor());
Para começar a navegar pela biblioteca de conteúdo do app de mídia, primeiro recupere o nó raiz
com getLibraryRoot()
:
Kotlin
// Get the library root to start browsing the library tree. val rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null) rootFuture.addListener({ // Root node MediaItem is available here with rootFuture.get().value }, MoreExecutors.directExecutor())
Java
// Get the library root to start browsing the library tree. ListenableFuture<LibraryResult<MediaItem>> rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null); rootFuture.addListener(() -> { // Root node MediaItem is available here with rootFuture.get().value }, MoreExecutors.directExecutor());
É possível navegar pela biblioteca de mídia recuperando os filhos de uma
MediaItem
na biblioteca com getChildren()
. Por exemplo, para recuperar o
filhos do nó raiz MediaItem
:
Kotlin
// Get the library root to start browsing the library tree. val childrenFuture = mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Int.MAX_VALUE, null) childrenFuture.addListener({ // List of children MediaItem nodes is available here with // childrenFuture.get().value }, MoreExecutors.directExecutor())
Java
ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> childrenFuture = mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Integer.MAX_VALUE, null); childrenFuture.addListener(() -> { // List of children MediaItem nodes is available here with // childrenFuture.get().value }, MoreExecutors.directExecutor());