Połącz z aplikacją do multimediów

Kontroler multimediów wchodzi w interakcję z sesją multimediów, by wykonywać zapytania i sterować odtwarzaniem w aplikacji multimedialnej. W Media3 interfejs API MediaController implementuje interfejs Player. Przykłady aplikacji klienckich korzystających z kontrolera multimediów to:

Kontroler multimediów może być przydatny w aplikacji multimedialnej, np. gdy odtwarzacz i sesja multimediów znajdują się w interfejsie Service poza obiektem Activity lub Fragment.

Tworzenie MediaController

Aby utworzyć MediaController, zacznij od utworzenia SessionToken dla odpowiedniego elementu MediaSession. Dobrym rozwiązaniem może być tu metoda onStart() (Activity lub Fragment).

Kotlin

val sessionToken = 
  SessionToken(context, ComponentName(context, PlaybackService::class.java))

Java

SessionToken sessionToken = 
  new SessionToken(context, new ComponentName(context, PlaybackService.class));

Użycie tego komponentu SessionToken do utworzenia interfejsu MediaController łączy kontroler z daną sesją. Następuje to asynchronicznie, dlatego należy wysłuchać wyniku i użyć go, gdy będzie dostępny.

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

Użyj MediaController

MediaController implementuje interfejs Player, dlatego można używać poleceń zdefiniowanych w interfejsie do sterowania odtwarzaniem podłączonego elementu MediaSession. Oznacza to, że wywołanie metody play() w interfejsie MediaController spowoduje wysłanie polecenia do połączonego MediaSession, który następnie przekaże to polecenie do bazowego elementu Player.

W podobny sposób możesz dodać do kontrolera Player.Listener, aby nasłuchiwać zmian stanu Player. Więcej informacji o korzystaniu ze zdarzeń Player.Listener znajdziesz w przewodniku po zdarzeniach odtwarzacza. Interfejs MediaController.Listener definiuje dodatkowe wywołania zwrotne dla zdarzeń i poleceń przychodzących z połączonego MediaSession, np. onAvailableSessionCommandsChanged(), gdy sesja multimediów zmieni dostępne polecenia sesji i onDisconnected(), gdy kontroler zostanie odłączony od sesji.

Podobnie jak w przypadku innych komponentów pamiętaj, aby zwolnić MediaController, gdy nie jest już potrzebny, na przykład w metodzie onStop() elementu Activity lub Fragment.

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

Zwolnienie kontrolera nadal będzie dostarczać wszystkie polecenia oczekujące wysłane do sesji i usunąć powiązanie z usługą sesji dopiero po wykonaniu tych poleceń lub po upływie określonego czasu oczekiwania (zależnie od tego, co nastąpi wcześniej).

Tworzenie i używanie obiektu MediaBrowser

MediaBrowser wykorzystuje funkcje oferowane przez MediaController, aby umożliwić też przeglądanie biblioteki multimediów oferowanej przez MediaLibraryService aplikacji multimedialnej.

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

Aby zacząć przeglądać bibliotekę treści aplikacji do multimediów, najpierw pobierz węzeł główny za pomocą polecenia 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());

Następnie możesz poruszać się po bibliotece multimediów, pobierając elementy podrzędne elementu MediaItem w bibliotece za pomocą getChildren(). Aby na przykład pobrać elementy podrzędne węzła głównego 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());