Cómo conectarse a una app de música

Un controlador multimedia interactúa con una sesión multimedia para consultar y controlar un contenido multimedia la reproducción de una app. En Media3, el objeto MediaController La API implementa la interfaz Player. Ejemplos de apps cliente que usan un archivo multimedia responsable incluyen:

Un controlador multimedia también puede ser útil dentro de una app multimedia, por ejemplo, si el y la sesión multimedia en vivo en un Service independiente de Activity o Fragment con la IU.

Cómo crear un MediaController

Para crear un MediaController, comienza por crear un SessionToken para el MediaSession correspondiente. El método onStart() de tu Activity o Fragment es un buen lugar para hacer esto.

Kotlin

val sessionToken = 
  SessionToken(context, ComponentName(context, PlaybackService::class.java))

Java

SessionToken sessionToken = 
  new SessionToken(context, new ComponentName(context, PlaybackService.class));

Si usas este SessionToken para compilar un MediaController, se conecta el el controlador a la sesión determinada. El proceso se lleva a cabo de forma asíncrona, por lo que escuchar el resultado y usarlo cuando esté disponible.

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

Usa un MediaController

MediaController implementa la interfaz Player, por lo que puedes usar los comandos definido en la interfaz para controlar la reproducción del MediaSession conectado. Esto quiere decir que si se llama a play() en un MediaController, se enviará el al MediaSession conectado, que posteriormente delegará el comando a su Player subyacente.

De manera similar, puedes agregar un Player.Listener al control para escuchar cambios en el estado Player. Consulta las Guía de eventos del jugador para obtener más información sobre el uso de Player.Listener. El MediaController.Listener define devoluciones de llamadas adicionales para eventos y comandos entrantes desde conectado a MediaSession, como onAvailableSessionCommandsChanged() para cuando la sesión multimedia cambie los comandos de sesión disponibles y onDisconnected() para cuando el controlador se desconecte de la sesión.

Al igual que con otros componentes, recuerda liberar el MediaController cuando sea ya no son necesarios, como en el método onStop() de una Activity o Fragment

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

Si liberas el control, se seguirán entregando todos los comandos pendientes enviados al sesión y solo se pueden desvincular del servicio de sesiones una vez que estos comandos se maneja o después de un tiempo de espera, lo que ocurra primero.

Crea y usa un MediaBrowser

Un MediaBrowser se basa en las capacidades que ofrece una MediaController para habilitar también la navegación por la biblioteca de contenido multimedia que ofrece un contenido multimedia MediaLibraryService de la 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 comenzar a explorar la biblioteca de contenido de la app de música, primero recupera el nodo raíz con 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());

Luego, puedes navegar por la biblioteca multimedia recuperando los elementos secundarios de un MediaItem en la biblioteca con getChildren(). Por ejemplo, para recuperar el Elementos secundarios del nodo raíz 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());