Kontroler multimediów wchodzi w interakcję z sesją multimediów, by wykonywać zapytania i sterować odtwarzaniem w aplikacji multimedialnej. W Media3 interfejs API MediaController
implementuje interfejs Player
. Przykłady aplikacji klienckich korzystających
z kontrolera multimediów to:
- Sterowanie multimediami w systemie Android
- Aplikacja towarzysząca na Androida Wear OS
- Android Auto i system operacyjny Automotive
- asystenci głosowi, np. Asystent Google;
- aplikacja testowa kontrolera multimediów,
Kontroler multimediów może być przydatny w aplikacji multimedialnej, np. gdy odtwarzacz i sesja multimediów znajdują się w interfejsie Service
poza obiektem Activity
lub Fragment
.
Tworzenie MediaController
Aby utworzyć MediaController
, zacznij od utworzenia SessionToken
dla
odpowiedniego elementu MediaSession
. Dobrym rozwiązaniem może być tu metoda onStart()
(Activity
lub Fragment
).
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
Java
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
Użycie tego komponentu SessionToken
do utworzenia interfejsu MediaController
łączy kontroler z daną sesją. Następuje to asynchronicznie, dlatego należy wysłuchać wyniku i użyć 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 MediaController
MediaController
implementuje interfejs Player
, dlatego można używać poleceń zdefiniowanych w interfejsie do sterowania odtwarzaniem podłączonego elementu MediaSession
.
Oznacza to, że wywołanie metody play()
w interfejsie MediaController
spowoduje wysłanie polecenia do połączonego MediaSession
, który następnie przekaże to polecenie do bazowego elementu Player
.
W podobny sposób możesz dodać do kontrolera Player.Listener
, aby nasłuchiwać zmian stanu Player
. Więcej informacji o korzystaniu ze zdarzeń Player.Listener
znajdziesz w przewodniku po zdarzeniach odtwarzacza. Interfejs MediaController.Listener
definiuje dodatkowe wywołania zwrotne dla zdarzeń i poleceń przychodzących z połączonego MediaSession
, np. onAvailableSessionCommandsChanged()
, gdy sesja multimediów zmieni dostępne polecenia sesji i onDisconnected()
, gdy kontroler zostanie odłączony od sesji.
Podobnie jak w przypadku innych komponentów pamiętaj, aby zwolnić MediaController
, gdy nie jest już potrzebny, na przykład w metodzie onStop()
elementu Activity
lub Fragment
.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Zwolnienie kontrolera nadal będzie dostarczać wszystkie polecenia oczekujące wysłane do sesji i usunąć powiązanie z usługą sesji dopiero po wykonaniu tych poleceń lub po upływie określonego czasu oczekiwania (zależnie od tego, co nastąpi wcześniej).
Tworzenie i używanie obiektu MediaBrowser
MediaBrowser
wykorzystuje funkcje oferowane przez MediaController
, aby umożliwić też przeglądanie biblioteki multimediów oferowanej przez MediaLibraryService
aplikacji multimedialnej.
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 zacząć przeglądać bibliotekę treści 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ą 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());