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 Client-Apps, die einen Mediencontroller verwenden, sind:
- Mediensteuerung unter Android
- Companion-App für Android Wear OS
- Android Auto und Automotive OS
- Sprachassistenten, z. B. Google Assistant
- Die 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, der von Activity
oder Fragment
mit der UI getrennt ist.
MediaController
erstellen
Wenn Sie ein MediaController
erstellen möchten, müssen Sie zuerst eine SessionToken
für die entsprechende MediaSession
erstellen. Die Methode onStart()
Ihrer Activity
oder Fragment
kann dafür gut geeignet sein.
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. Da dies asynchron erfolgt, sollten Sie auf das Ergebnis warten und es verwenden, sofern verfügbar.
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 beim Aufrufen von play()
für eine MediaController
der Befehl an die verbundene MediaSession
gesendet wird, die den Befehl anschließend an die zugrunde liegende Player
delegiert.
Ebenso können Sie dem Controller eine Player.Listener
hinzufügen, um auf Änderungen im Status Player
zu warten. Weitere Informationen zur Verwendung von Player.Listener
finden Sie in der Anleitung zu Playerereignissen. Die Schnittstelle MediaController.Listener
definiert zusätzliche Callbacks für Ereignisse und eingehende Befehle vom verbundenen MediaSession
, z. B. onAvailableSessionCommandsChanged()
, wenn die Mediensitzung die verfügbaren Sitzungsbefehle ändert, und onDisconnected()
, wenn der Controller von der Sitzung getrennt wird.
Denken Sie wie bei anderen Komponenten daran, MediaController
freizugeben, wenn sie nicht mehr benötigt wird, z. B. in der onStop()
-Methode von Activity
oder Fragment
.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Durch die Freigabe des Controllers werden weiterhin alle ausstehenden Befehle bereitgestellt, die an die Sitzung gesendet werden, und die Bindung an den Sitzungsdienst wird erst aufgehoben, nachdem diese Befehle verarbeitet wurden oder nach einem Zeitlimit, je nachdem, was zuerst eintritt.
MediaBrowser
erstellen und verwenden
Ein MediaBrowser
baut auf den Funktionen von MediaController
auf, um auch das Durchsuchen der Mediathek zu ermöglichen, die vom 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());
Rufen Sie zuerst mit getLibraryRoot()
den Stammknoten ab, um in der Inhaltsbibliothek der Medien-App zu suchen:
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());
Anschließend kannst du in der Mediathek navigieren. Dazu rufst du die untergeordneten Elemente von MediaItem
in der Bibliothek mit getChildren()
ab. 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());