Ein Mediencontroller 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 Clientanwendungen, die einen Mediacontroller verwenden:
- Mediensteuerung des Android-Systems
- Companion-App für Android Wear OS
- Android Auto und Automotive OS
- Sprachassistenten wie Google Assistant
- Media Controller Test App
Ein Mediencontroller kann auch innerhalb einer Medien-App nützlich sein, z. B. wenn sich der Player und die Mediensitzung in einem Service
befinden, das von Activity
oder Fragment
mit der UI getrennt ist.
MediaController
erstellen
Um eine MediaController
zu erstellen, erstellen Sie zuerst eine SessionToken
für die entsprechende MediaSession
. Die Methode onStart()
von Activity
oder Fragment
eignet sich hierfür gut.
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
Java
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
Wenn Sie dann SessionToken
zum Erstellen eines MediaController
verwenden, wird der Controller mit der jeweiligen Sitzung verbunden. Da dies asynchron erfolgt, sollten Sie auf das Ergebnis warten und es verwenden, wenn 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, sodass Sie die in der Schnittstelle definierten Befehle verwenden können, um die Wiedergabe der verbundenen MediaSession
zu steuern.
Dies bedeutet, dass durch das Aufrufen von play()
für eine MediaController
der Befehl an das verbundene MediaSession
gesendet wird, das den Befehl anschließend an seinen zugrunde liegenden Player
delegiert.
Ebenso können Sie dem Controller einen Player.Listener
hinzufügen, um auf Änderungen im Player
-Status zu warten. Weitere Informationen zur Verwendung von Player.Listener
findest du im Leitfaden zu Playerereignissen. Die MediaController.Listener
-Schnittstelle definiert zusätzliche Callbacks für Ereignisse und eingehende Befehle von der verbundenen MediaSession
. Beispielsweise onAvailableSessionCommandsChanged()
für den Fall, dass die Mediensitzung die verfügbaren Sitzungsbefehle ändert, und onDisconnected()
für den Fall, dass der Controller von der Sitzung getrennt wird.
Geben Sie wie bei anderen Komponenten die MediaController
frei, wenn sie nicht mehr benötigt wird, z. B. in der onStop()
-Methode eines Activity
- oder Fragment
-Objekts.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Durch die Freigabe des Controllers werden weiterhin alle ausstehenden Befehle gesendet, die an die Sitzung gesendet wurden, und die Bindung an den Sitzungsdienst wird erst aufgehoben, nachdem diese Befehle verarbeitet wurden oder nach Ablauf eines Zeitlimits – je nachdem, was zuerst eintritt.
MediaBrowser
erstellen und verwenden
Ein MediaBrowser
baut auf den Funktionen eines MediaController
auf, um auch die Mediathek durchsuchen zu können, die von der MediaLibraryService
einer Medien-App angeboten wird.
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());
Um die Inhaltsbibliothek der Medien-App zu durchsuchen, rufen Sie zuerst den Stammknoten mit getLibraryRoot()
ab:
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());
Sie können dann durch die Mediathek navigieren, indem Sie die untergeordneten Elemente einer MediaItem
in der Bibliothek mit getChildren()
abrufen. 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());