Un controller multimediale interagisce con una sessione multimediale per eseguire query e controllare la riproduzione di un'app multimediale. In Media3, l'API MediaController
implementa l'interfaccia Player
. Esempi di app client che utilizzano un controller multimediale includono:
- Controlli multimediali di sistema Android
- App complementare Android Wear OS
- Sistema operativo Android Auto e Automotive
- Assistenti vocali, come l'Assistente Google
- L'app Media Controller Test
Un controller multimediale può essere utile anche all'interno di un'app multimediale, ad esempio se il player e la sessione multimediale sono attivi in un Service
separato da Activity
o in Fragment
con la UI.
Crea un MediaController
Per creare un MediaController
, inizia creando un SessionToken
per il MediaSession
corrispondente. Il metodo onStart()
delle Activity
o
Fragment
può essere adatto a questo scopo.
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
Java
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
L'utilizzo di SessionToken
per creare una MediaController
connette il controller alla sessione specificata. Questa operazione avviene in modo asincrono, perciò dovresti
ascoltare il risultato e utilizzarlo, se disponibile.
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 l'interfaccia Player
, quindi puoi utilizzare i comandi
definiti nell'interfaccia per controllare la riproduzione del dispositivo MediaSession
collegato.
Questo significa che la chiamata di play()
su MediaController
invierà il comando al MediaSession
connesso, che successivamente delegherà il comando al rispettivo Player
sottostante.
Allo stesso modo, puoi aggiungere un Player.Listener
al controller per ascoltare le
modifiche allo stato Player
. Per ulteriori dettagli sull'uso di un Player.Listener
, consulta la guida relativa agli eventi del player. L'interfaccia MediaController.Listener
definisce callback aggiuntivi per eventi e comandi in entrata dal MediaSession
connesso, ad esempio onAvailableSessionCommandsChanged()
per quando la sessione multimediale modifica i comandi di sessione disponibili e onDisconnected()
per quando il controller viene disconnesso dalla sessione.
Come per altri componenti, ricordati di rilasciare MediaController
quando non è più necessario, ad esempio nel metodo onStop()
di Activity
o Fragment
.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Una volta rilasciato, il controller continuerà a inviare tutti i comandi in attesa inviati alla sessione e lo svincolerà dal servizio sessione solo dopo che questi comandi sono stati gestiti o dopo un periodo di timeout, a seconda dell'evento che si verifica per primo.
Crea e utilizza un MediaBrowser
Un elemento MediaBrowser
si basa sulle funzionalità offerte da un MediaController
per consentire anche la navigazione nella libreria multimediale offerta da MediaLibraryService
di un'app multimediale.
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());
Per iniziare a sfogliare la raccolta di contenuti dell'app multimediale, devi prima recuperare il nodo radice 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());
Puoi quindi navigare nella raccolta multimediale recuperando gli elementi secondari di un MediaItem
nella raccolta con getChildren()
. Ad esempio, per recuperare i componenti secondari del nodo radice 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());