Kontroler multimediów wchodzi w interakcję z sesją multimediów, aby wysyłać zapytania i sterować odtwarzaniem w aplikacji multimedialnej. W Media3 interfejs API MediaController
implementuje interfejs Player
. Przykłady aplikacji klienckich, które korzystają z kontrolera multimediów:
- Sterowanie multimediami w systemie Android
- Aplikacja towarzysząca Androida Wear OS
- Android Auto i Android Automotive
- Asystenci głosowi, np. Asystent Google
- aplikacja Media Controller Test,
Kontroler multimediów może być przydatny w aplikacji multimedialnej, na przykład jeśli odtwarzacz i sesja multimedialna znajdują się w Service
osobnym procesieActivity
lub Fragment
wątkuActivity
z interfejsem.
Tworzenie MediaController
Aby utworzyć MediaController
, zacznij od utworzenia SessionToken
dla odpowiedniego MediaSession
. Dobrym miejscem na to może być 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 SessionToken
do utworzenia MediaController
łączy kontroler z daną sesją. Odbywa się to asynchronicznie, więc powinieneś(-aś) nasłuchiwać wyniku i używać 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
, więc możesz używać poleceń zdefiniowanych w tym interfejsie do sterowania odtwarzaniem podłączonego urządzenia MediaSession
.
Oznacza to, że wywołanie play()
na urządzeniu MediaController
spowoduje wysłanie polecenia do połączonego urządzenia MediaSession
, które następnie przekaże polecenie do bazowego urządzenia Player
.
Do kontrolera możesz dodać Player.Listener
, aby monitorować zmiany stanu Player
. Więcej informacji o używaniu Player.Listener
znajdziesz w przewodniku Zdarzenia odtwarzacza.
Interfejs MediaController.Listener
definiuje dodatkowe wywołania zwrotne dla zdarzeń i poleceń niestandardowych z połączonego MediaSession
. Przykłady:onCustomCommand()
gdy sesja wysyła polecenie niestandardowe,onAvailableSessionCommandsChanged()
gdy sesja zmienia dostępne polecenia sesji lub onDisconnected()
gdy kontroler jest odłączony od sesji.
Wartość MediaController.Listener
można ustawić podczas tworzenia kontrolera za pomocą elementu Builder
:
Kotlin
MediaController.Builder(context, sessionToken)
.setListener(
object : MediaController.Listener {
override fun onCustomCommand(
controller: MediaController,
command: SessionCommand,
args: Bundle,
): ListenableFuture<SessionResult> {
// Handle custom command.
return Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
}
override fun onDisconnected(controller: MediaController) {
// Handle disconnection.
}
}
)
.buildAsync()
Java
new MediaController.Builder(context, sessionToken)
.setListener(
new MediaController.Listener() {
@Override
public ListenableFuture<SessionResult> onCustomCommand(
MediaController controller, SessionCommand command, Bundle args) {
// Handle custom command.
return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS));
}
@Override
public void onDisconnected(MediaController controller) {
// Handle disconnection.
}
})
.buildAsync();
Podobnie jak w przypadku innych komponentów, pamiętaj, aby zwolnić MediaController
, gdy nie jest już potrzebny, np. w metodzie onStop()
obiektu Activity
lub Fragment
.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Zwolnienie kontrolera nadal będzie powodować dostarczanie wszystkich oczekujących poleceń wysłanych do sesji i odłączenie od usługi sesji dopiero po obsłużeniu tych poleceń lub po upływie czasu oczekiwania (w zależności od tego, co nastąpi wcześniej).
Tworzenie i używanie MediaBrowser
MediaBrowser
korzysta z funkcji oferowanych przez MediaController
, ale umożliwia 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 rozpocząć przeglądanie biblioteki treści aplikacji multimedialnej, najpierw pobierz węzeł główny za pomocą 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ą funkcji 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());
Wyświetlanie elementów sterujących odtwarzaniem innej aplikacji do odtwarzania multimediów
Podczas wyświetlania elementów sterujących interfejsu z przyciskami innej aplikacji multimedialnej ważne jest, aby przestrzegać zadeklarowanych ustawień przycisków multimedialnych tej aplikacji.
Najlepszym sposobem na rozwiązanie problemu z preferencjami aplikacji oraz ograniczeniami i wymaganiami interfejsu jest użycie CommandButton.DisplayConstraints
. Możesz określić limity i ograniczenia interfejsu, a metoda resolve
zawiera listę przycisków do wyświetlenia wraz z ikoną, pozycją i zamierzonym działaniem.