Un controlador multimedia interactúa con una sesión multimedia para buscar y controlar la reproducción de una app de música. En Media3, la API de MediaController
implementa la interfaz Player
. Entre los ejemplos de apps cliente que usan un controlador multimedia, se incluyen los siguientes:
- Controles multimedia del sistema Android
- Aplicación complementaria de Android Wear OS
- Android Auto y SO Automotive
- Asistentes de voz, como Asistente de Google
- La app de prueba del controlador multimedia
Un controlador multimedia también puede ser útil dentro de una app de música, por ejemplo, si el reproductor y la sesión multimedia viven en un Service
separado de Activity
o Fragment
con la IU.
Crear un elemento MediaController
Para crear un MediaController
, comienza por crear un SessionToken
para el MediaSession
correspondiente. El método onStart()
de tu Activity
o Fragment
puede ser un buen lugar para hacerlo.
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
Java
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
El uso de este SessionToken
para compilar un MediaController
conecta el controlador a la sesión determinada. Esto ocurre de forma asíncrona, por lo que debes 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 una MediaController
MediaController
implementa la interfaz Player
, por lo que puedes usar los comandos definidos en ella para controlar la reproducción del MediaSession
conectado.
Es decir, si se llama a play()
en un MediaController
, se enviará el comando al MediaSession
conectado, que luego delegará el comando a su Player
subyacente.
Del mismo modo, puedes agregar un Player.Listener
al control para detectar cambios en el estado Player
. Consulta la guía de eventos del jugador para obtener más detalles sobre el uso de Player.Listener
. La interfaz de MediaController.Listener
define devoluciones de llamada adicionales para los eventos y los comandos entrantes del MediaSession
conectado, como onAvailableSessionCommandsChanged()
para cuando la sesión multimedia cambia los comandos de la sesión disponibles y onDisconnected()
para cuando el controlador se desconecta de la sesión.
Al igual que con otros componentes, recuerda liberar el MediaController
cuando ya no sea necesario, como en el método onStop()
de un Activity
o Fragment
.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Esta acción seguirá entregando todos los comandos pendientes enviados a la sesión y solo se desvincularán del servicio de sesión una vez que se hayan manejado estos comandos o después de un período de tiempo de espera, lo que ocurra primero.
Crea y usa un MediaBrowser
Un MediaBrowser
se basa en las capacidades que ofrece un MediaController
para permitir también la navegación por la biblioteca multimedia que ofrece el MediaLibraryService
de una app multimedia.
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 los elementos secundarios del nodo raíz MediaItem
, haz lo siguiente:
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());