Un controllo 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
. Ecco alcuni esempi di app client che utilizzano un media controller:
- Controlli multimediali del sistema Android
- App complementare Android Wear OS
- Android Auto e Automotive OS
- Assistenti vocali, come l'Assistente Google
- L'app di test del controller multimediale
Un controller multimediale può essere utile anche all'interno di un'app multimediale, ad esempio se il media player e la sessione multimediale si trovano in un Service
separato dal Activity
o dal Fragment
con l'interfaccia utente.
Crea un MediaController
Per creare un MediaController
, inizia creando un SessionToken
per il corrispondente MediaSession
. Il metodo onStart()
di Activity
o
Fragment
può essere un buon punto di partenza.
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
Java
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
L'utilizzo di questo SessionToken
per creare un MediaController
connette il controller alla sessione specificata. Poiché questa operazione avviene in modo asincrono, dovresti
ascoltare il risultato e utilizzarlo quando è 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());
Utilizza un MediaController
MediaController
implementa l'interfaccia Player
, quindi puoi utilizzare i comandi definiti nell'interfaccia per controllare la riproduzione del MediaSession
collegato.
Ciò significa che chiamare play()
su un MediaController
invierà il comando al MediaSession
connesso, che successivamente lo delegherà al Player
sottostante.
Allo stesso modo, puoi aggiungere un Player.Listener
al controller per ascoltare
le modifiche allo stato Player
. Per ulteriori dettagli sull'utilizzo di un Player.Listener
, consulta la guida sugli eventi relativi ai giocatori. L'interfaccia MediaController.Listener
definisce callback aggiuntivi per gli eventi e i comandi in arrivo dal MediaSession
collegato, ad esempio
onAvailableSessionCommandsChanged()
per quando la sessione multimediale modifica i comandi della sessione disponibili e
onDisconnected()
per quando il controller è disconnesso dalla sessione.
Come per gli altri componenti, ricordati di rilasciare MediaController
quando non è più necessario, ad esempio nel metodo onStop()
di un Activity
o
Fragment
.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Il rilascio del controller invierà comunque tutti i comandi in attesa inviati alla sessione e si disaccoppia dal servizio della sessione solo dopo che questi comandi sono stati gestiti o dopo un periodo di timeout, a seconda dell'evento che si verifica per primo.
Creare e utilizzare un MediaBrowser
Un MediaBrowser
si basa sulle funzionalità offerte da un MediaController
per consentire anche la navigazione nella raccolta 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 principale
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 i figli di un
MediaItem
nella raccolta con getChildren()
. Ad esempio, per recuperare i figli del nodo principale 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());