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 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 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.

KotlinJava
val sessionToken = 
  SessionToken(context, ComponentName(context, PlaybackService::class.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 nasłuchiwać wyników i używać ich, gdy są dostępne.

KotlinJava
val controllerFuture =
  MediaController.Builder(context, sessionToken).buildAsync()
controllerFuture.addListener({
  // MediaController is available here with controllerFuture.get()
}, MoreExecutors.directExecutor())
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ń 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.

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

KotlinJava
MediaController.releaseFuture(controllerFuture)
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 rozszerza możliwości oferowane przez MediaController, aby umożliwić też przeglądanie biblioteki multimediów oferowanej przez MediaLibraryService aplikacji.

KotlinJava
val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync()
browserFuture.addListener({
  // MediaBrowser is available here with browserFuture.get()
}, MoreExecutors.directExecutor())
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():

KotlinJava
// 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())
// 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:

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