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 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 live in un Service
separato da Activity
o
Fragment
con l'UI.
Crea un MediaController
Per creare un MediaController
, inizia creando un SessionToken
per
MediaSession
corrispondente. Il metodo onStart()
di Activity
o
Fragment
può essere un buon posto per farlo.
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 la
un controller per una data sessione. Poiché questo avviene in modo asincrono,
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 usare i comandi
definita nell'interfaccia per controllare la riproduzione dell'elemento MediaSession
connesso.
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 ascoltare
modifiche nello stato Player
. Consulta le
Guida agli eventi del player
per ulteriori dettagli sull'utilizzo di un Player.Listener
. 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 l'MediaController
una volta
non più necessario, ad esempio nel metodo onStop()
di un Activity
o
Fragment
.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Una volta rilasciato il controller, tutti i comandi in attesa inviati al controller e scollegati dal servizio di sessione solo dopo che questi comandi hanno gestiti o dopo un periodo di timeout, a seconda dell'evento che si verifica per primo.
Crea e usa 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.
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 gli elementi secondari di un
MediaItem
nella raccolta con getChildren()
. Ad esempio, per recuperare
secondari 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());