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