Ein Mediacontroller interagiert mit einer Mediensitzung, um die Wiedergabe einer Medien-App abzufragen und zu steuern. In Media3 implementiert die MediaController
API die Player
-Schnittstelle. Beispiele für Client-Apps, die einen Mediacontroller verwenden:
- Android-Systemmediensteuerung
- Android Wear OS-Companion-App
- Android Auto und Automotive OS
- Sprachassistenten, z. B. Google Assistant
- Media Controller Test App
Eine Mediensteuerung kann auch in einer Medien-App nützlich sein, z. B. wenn sich der Player und die Mediensitzung in einer Service
befinden, die von der Activity
oder Fragment
mit der Benutzeroberfläche getrennt ist.
MediaController
erstellen
Wenn Sie eine MediaController
erstellen möchten, müssen Sie zuerst eine SessionToken
für die entsprechende MediaSession
erstellen. Die onStart()
-Methode Ihrer Activity
oder Fragment
eignet sich gut dafür.
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
Java
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
Die Verwendung dieses SessionToken
zum Erstellen einer MediaController
verbindet den Controller mit der angegebenen Sitzung. Dies geschieht asynchron. Sie sollten also auf das Ergebnis warten und es verwenden, sobald es verfügbar ist.
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());
MediaController
verwenden
MediaController
implementiert die Player
-Schnittstelle. Sie können also die Wiedergabe der verbundenen MediaSession
über die in der Schnittstelle definierten Befehle steuern.
Wenn also play()
auf einem MediaController
aufgerufen wird, wird der Befehl an den verbundenen MediaSession
gesendet, der ihn dann an den zugrunde liegenden Player
weiterleitet.
Ebenso können Sie dem Controller einen Player.Listener
hinzufügen, um auf Änderungen des Player
-Status zu warten. Weitere Informationen zur Verwendung von Player.Listener
findest du im Leitfaden zu Player-Ereignissen. Die MediaController.Listener
-Schnittstelle definiert zusätzliche Rückrufe für Ereignisse und eingehende Befehle vom verbundenen MediaSession
, z. B. onAvailableSessionCommandsChanged()
, wenn die Mediensitzung die verfügbaren Sitzungsbefehle ändert, und onDisconnected()
, wenn die Verbindung des Controllers zur Sitzung getrennt wird.
Wie bei anderen Komponenten müssen Sie auch die MediaController
freigeben, wenn sie nicht mehr benötigt wird, z. B. in der onStop()
-Methode einer Activity
oder Fragment
.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Wenn du den Controller freigibst, werden alle ausstehenden Befehle, die an die Sitzung gesendet wurden, weiterhin gesendet. Die Bindung zum Sitzungsdienst wird erst aufgehoben, wenn diese Befehle verarbeitet wurden oder nach Ablauf einer Zeitüberschreitung, je nachdem, was zuerst eintritt.
MediaBrowser
erstellen und verwenden
Eine MediaBrowser
baut auf den Funktionen einer MediaController
auf, um auch die Medienbibliothek der MediaLibraryService
einer Medien-App durchsuchen zu können.
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());
Wenn du die Inhaltsbibliothek der Medien-App durchsuchen möchtest, musst du zuerst den Stammknoten mit getLibraryRoot()
abrufen:
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());
Du kannst dann durch die Mediathek navigieren, indem du mit getChildren()
die untergeordneten Elemente einer MediaItem
in der Mediathek abfragst. So rufen Sie beispielsweise die untergeordneten Elemente des Stammknotens MediaItem
ab:
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());