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.:
- Sterowanie multimediami w systemie Android
- Aplikacja towarzysząca na Androida Wear
- Systemy operacyjne Android Auto i Automotive
- Asystenci głosowi, np. Asystent Google
- aplikacji Test kontrolera multimediów,
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());