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 Mediacontroller verwenden:
- Android-Systemmediensteuerung
- Android Wear OS-Companion-App
- Android Auto und Automotive OS
- Sprachassistenten wie 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 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. 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 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.
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);
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
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());
Anschließend kannst du durch die Mediathek navigieren, indem du die untergeordneten Elemente von MediaItem
in der Bibliothek mit getChildren()
abrufst. 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());