Connettersi a un'app multimediale

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:

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.

KotlinJava
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.

KotlinJava
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.

KotlinJava
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.

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

KotlinJava
// 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:

KotlinJava
// 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());