Un controller multimediale interagisce con una sessione multimediale per eseguire query e controllare un contenuto multimediale
durante la riproduzione dell'app. In Media3, la MediaController
L'API implementa l'interfaccia Player
. Esempi di app client che utilizzano un file multimediale
di controllo includono:
- 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 player e la sessione multimediale live in un Service
separato da Activity
o
Fragment
con l'UI.
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.
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.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é questo avviene in modo asincrono,
ascoltare il risultato e utilizzarlo se disponibile.
val controllerFuture = MediaController.Builder(context, sessionToken).buildAsync() controllerFuture.addListener({ // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor())
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.
Questo significa che chiamare play()
su MediaController
invierà il
al comando MediaSession
connesso, che successivamente delegherà la
al relativo Player
sottostante.
Analogamente, puoi aggiungere un Player.Listener
al controller per rilevare le modifiche allo stato Player
. Per ulteriori dettagli sull'utilizzo di un Player.Listener
, consulta la guida relativa agli eventi relativi ai giocatori. MediaController.Listener
dell'interfaccia utente definisce callback aggiuntivi per gli eventi e i comandi in arrivo
MediaSession
connessa, ad esempio
onAvailableSessionCommandsChanged()
:
quando la sessione multimediale modifica i comandi di sessione disponibili
onDisconnected()
per quando il controller viene 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
.
MediaController.releaseFuture(controllerFuture)
MediaController.releaseFuture(controllerFuture);
Il rilascio del controller invierà comunque tutti i comandi in attesa inviati alla sessione e si scollegherà dal servizio della sessione solo dopo che questi comandi saranno 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 attivare anche la navigazione nella raccolta multimediale offerta da un contenuto multimediale
MediaLibraryService
dell'app.
val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync() browserFuture.addListener({ // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor())
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()
:
// 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())
// 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
figlio del nodo principale MediaItem
:
// 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())
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());