Połącz z aplikacją do multimediów

Kontroler multimediów wchodzi w interakcję z sesją multimediów, aby wysyłać zapytania o multimedia i sterować nimi odtwarzania w aplikacji. W Media3 MediaController Interfejs API implementuje interfejs Player. Przykłady aplikacji klienckich, które korzystają z multimediów kontrolery, m.in.:

Kontroler multimediów może być też przydatny w aplikacji do multimediów, na przykład jeśli i odtwarzacze i sesje multimediów są dostępne w Service innym niż Activity lub Fragment za pomocą interfejsu użytkownika.

Tworzenie MediaController

Aby utworzyć MediaController, zacznij od utworzenia SessionToken dla odpowiadające wartości: MediaSession. Metoda onStart() Twojej metody Activity lub Fragment to dobre miejsce.

Kotlin

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

Java

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

SessionToken do utworzenia MediaController łączy do danej sesji. Odbywa się to asynchronicznie, więc 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, więc możesz używać poleceń zdefiniowane w interfejsie do sterowania odtwarzaniem w połączonym urządzeniu MediaSession. Oznacza to, że wywołanie play() na urządzeniu MediaController spowoduje wysłanie do połączonego parametru MediaSession, co spowoduje przekazanie polecenia do podstawowego elementu Player.

W podobny sposób możesz dodać do kontrolera element Player.Listener, który będzie nasłuchiwać zmiany stanu Player. Zapoznaj się z Przewodnik po zdarzeniach graczy aby dowiedzieć się więcej o korzystaniu z: Player.Listener. MediaController.Listener definiuje dodatkowe wywołania zwrotne dla zdarzeń i poleceń przychodzących połączone urządzenia MediaSession, takie jak onAvailableSessionCommandsChanged(). gdy sesja multimediów zmieni dostępne polecenia sesji i onDisconnected(). , gdy kontroler jest odłączony od sesji.

Tak jak w przypadku innych komponentów, pamiętaj, by zwolnić MediaController, gdy będzie nie są już potrzebne, na przykład w metodzie onStop() funkcji Activity lub Fragment

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

Zwolnienie kontrolera nadal spowoduje przekazanie wszystkich oczekujących poleceń wysłanych do i usunąć powiązanie z usługą sesji dopiero po wykonaniu tych poleceń lub po upływie limitu czasu, w zależności od tego, co nastąpi wcześniej.

Tworzenie i używanie MediaBrowser

MediaBrowser rozszerza możliwości oferowane przez MediaController, aby umożliwić też przeglądanie biblioteki multimediów oferowanej przez MediaLibraryService aplikacji.

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 z użytkownikiem 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());

Można następnie poruszać się po bibliotece multimediów, pobierając elementy podrzędne MediaItem w bibliotece z: getChildren(). Aby na przykład pobrać parametr 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());