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 odpowiadającego mu 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 karty MediaController

MediaController implementuje interfejs Player, dzięki czemu możesz używać poleceń zdefiniowanych w interfejsie do sterowania odtwarzaniem połączonego pliku MediaSession. Oznacza to, że wywołanie play() w MediaController spowoduje wysłanie polecenia do połączonego MediaSession, które następnie przekaże je do bazowego elementu Player.

Podobnie możesz dodać do kontrolera Player.Listener, aby monitorować zmiany stanu Player. Więcej informacji o korzystaniu z Player.Listener znajdziesz w przewodniku po zdarzeniach odtwarzacza. 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 i onDisconnected() w przypadku rozłączenia kontrolera z sesją.

Tak jak w przypadku innych komponentów, pamiętaj, by zwolnić MediaController, gdy nie jest już potrzebny, np. w metodzie onStop() w obiekcie 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 rozpocząć przeglądanie biblioteki treści w 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ą elementu getChildren(). Aby na przykład pobrać podelementy węzła 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());