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