Ein Mediacontroller interagiert mit einer Mediensitzung, um die Wiedergabe einer Medien-App abzufragen und zu steuern. In Media3 wird der MediaController
Die API implementiert die Player
-Schnittstelle. Beispiele für Client-Apps, die ein Medienobjekt verwenden
Verantwortliche sind:
- Android-Systemmediensteuerung
- Android Wear OS-Companion-App
- Android Auto und Automotive OS
- Sprachassistenten wie Google Assistant
- Die Media Controller Test App
Ein Mediencontroller kann auch in einer Medien-App nützlich sein, z. B. wenn der
Player und Mediensitzung live in einem Service
getrennt vom Activity
oder
Fragment
mit der UI.
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.
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
Die Verwendung von SessionToken
zum Erstellen einer MediaController
verbindet die
für die betreffende Sitzung. Dies geschieht asynchron. Sie sollten also auf das Ergebnis warten und es verwenden, sobald es verfügbar ist.
val controllerFuture = MediaController.Builder(context, sessionToken).buildAsync() controllerFuture.addListener({ // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor())
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 finden Sie im
Leitfaden zu Spielerereignissen
finden Sie weitere Informationen zur Verwendung von Player.Listener
. Das MediaController.Listener
definiert zusätzliche Callbacks für Ereignisse und eingehende Befehle vom
verbundene MediaSession
, z. B.
onAvailableSessionCommandsChanged()
wenn die Mediensitzung die verfügbaren Sitzungsbefehle ändert
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
.
MediaController.releaseFuture(controllerFuture)
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.
val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync() browserFuture.addListener({ // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor())
ListenableFuture<MediaBrowser> browserFuture = new MediaBrowser.Builder(context, sessionToken).buildAsync(); browserFuture.addListener(() -> { // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor());
Um in der Inhaltsbibliothek der Medien-App zu stöbern, rufen Sie zuerst den Root-Knoten ab
mit getLibraryRoot()
:
// 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())
// 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. Um beispielsweise den
untergeordnetes Element des Stammknotens MediaItem
:
// 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())
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());