Conectar a um app de música

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:

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());