Połącz z aplikacją do multimediów

Kontroler multimediów wchodzi w interakcję z sesją multimediów, aby wysyłać zapytania i sterować odtwarzaniem w aplikacji do multimediów. 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 do multimediów, na przykład jeśli odtwarzacz i sesja multimediów znajdują się w Serviceinnych niż Activity lub Fragment interfejsie użytkownika.

Tworzenie MediaController

Aby utworzyć MediaController, zacznij od utworzenia SessionToken dla odpowiadającego mu MediaSession. Dobrym rozwiązaniem może być metoda onStart() metody Activity lub Fragment.

Kotlin

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

Java

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

Dane SessionToken do utworzenia MediaController łączą kontroler z daną sesją. Odbywa się to asynchronicznie, więc należy nasłuchiwać wyników i używać ich, gdy są dostępne.

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 formy płatności 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 nasłuchiwać zmian stanu Player. Więcej informacji o korzystaniu z Player.Listener znajdziesz w przewodniku po zdarzeniach odtwarzacza. Interfejs MediaController.Listener definiuje dodatkowe wywołania zwrotne zdarzeń i poleceń przychodzących z połączonego MediaSession, np. onAvailableSessionCommandsChanged(), gdy sesja multimediów zmienia dostępne polecenia sesji oraz onDisconnected(), gdy kontroler jest odłączony od sesji.

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

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

Zwolnienie kontrolera nadal spowoduje przekazanie wszystkich oczekujących poleceń wysyłanych do sesji i usunięcie powiązania z usługą sesji dopiero po zakończeniu obsługi tych poleceń lub po upływie określonego czasu oczekiwania (w zależności od tego, co nastąpi wcześniej).

Tworzenie i używanie MediaBrowser

MediaBrowser rozszerza możliwości oferowane przez usługę MediaController i umożliwia też przeglądanie biblioteki multimediów dostępnej w MediaLibraryService 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 z biblioteki za pomocą polecenia 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());