Połącz z aplikacją do multimediów

Kontroler multimediów wchodzi w interakcję z sesją multimediów, aby wysyłać zapytania do aplikacji multimediów i sterować odtwarzaniem. W Media3 interfejs API MediaController implementuje interfejs Player. Przykłady aplikacji klienckich, które korzystają z kontrolera multimediów:

Kontroler multimediów może być też przydatny w aplikacji multimedialnej, na przykład jeśli odtwarzacz i sesja multimediów znajdują się w Service oddzielnie od Activity lub Fragment z interfejsem.

Tworzenie MediaController

Aby utworzyć MediaController, zacznij od utworzenia SessionToken dla odpowiedniego MediaSession. Możesz użyć metody onStart() w klasie Activity lub Fragment.

Kotlin

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

Java

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

Korzystając z tego SessionToken, możesz utworzyć MediaController, który łączy kontroler z danym seansem. Odbywa się to asynchronicznie, więc musisz nasłuchiwać wyniku i używać 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, więc możesz używać poleceń zdefiniowanych w interfejsie do sterowania odtwarzaniem połączonego urządzenia MediaSession. Oznacza to, że wywołanie play() na MediaController spowoduje wysłanie polecenia do połączonego MediaSession, który następnie deleguje to polecenie do Player.

Podobnie możesz dodać do kontrolera Player.Listener, aby monitorować zmiany stanu Player. Więcej informacji o używaniu Player.Listener znajdziesz w przewodniku Zdarzenia dotyczące gracza. Interfejs MediaController.Listener definiuje dodatkowe funkcje wywoływane z przypadkiem zdarzeń i przychodzących poleceń z połączonego urządzenia MediaSession, takie jak onAvailableSessionCommandsChanged() w przypadku zmiany dostępnych poleceń sesji oraz onDisconnected() w przypadku rozłączenia kontrolera z sesją.

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

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

Zwolnienie kontrolera spowoduje nadal wysyłanie wszystkich oczekujących poleceń do sesji i odłączenie od usługi sesji dopiero po obsłudze tych poleceń lub po upływie czasu oczekiwania (zależnie od tego, co nastąpi wcześniej).

Tworzenie i używanie MediaBrowser

MediaBrowser opiera się na możliwościach oferowanych przez MediaController, aby umożliwić przeglądanie biblioteki multimediów oferowanej przez MediaLibraryService w aplikacji do multimediów.

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ę multimediów aplikacji, najpierw pobierz węzeł główny za pomocą funkcji 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ą elementu getChildren(). Aby na przykład pobrać podelementy 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());