Ein Mediencontroller interagiert mit einer Mediensitzung, um ein Medium abzufragen und zu steuern
die Wiedergabe der App. In Media3 wird der MediaController
Die API implementiert die Player
-Schnittstelle. Beispiele für Client-Apps, die ein Medienobjekt verwenden
Verantwortliche sind:
- Mediensteuerung auf Android-Geräten
- 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 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
Um einen MediaController
zu erstellen, müssen Sie zuerst einen SessionToken
für den
entsprechenden MediaSession
. Die Methode onStart()
Ihres Activity
- oder
Fragment
ist dafür eine gute Wahl.
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
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. Da dies asynchron erfolgt, sollten Sie
um auf das Ergebnis zu warten und es zu 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 Befehle verwenden können
die in der Benutzeroberfläche definiert wurde, um die Wiedergabe des verbundenen MediaSession
zu steuern.
Das bedeutet, dass beim Aufrufen von play()
auf einem MediaController
folgende Bedingung gesendet wird:
an den verbundenen MediaSession
, der anschließend
an die zugrunde liegende Player
übergeben.
Du kannst dem Controller auch eine Player.Listener
hinzufügen, um auf
Änderungen am Status Player
. Weitere Informationen finden Sie im
Anleitung 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 auch muss MediaController
freigegeben werden, wenn
nicht mehr benötigt, z. B. in der onStop()
-Methode eines Activity
- oder
Fragment
.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
Wenn Sie den Controller freigeben, werden weiterhin alle ausstehenden Befehle an die und heben Sie die Bindung an den Sitzungsdienst erst auf, oder nach Ablauf einer Zeitüberschreitung, je nachdem, was zuerst eintritt.
MediaBrowser
erstellen und verwenden
Ein MediaBrowser
baut auf den Funktionen auf, die ein
MediaController
, um auch das Durchsuchen der Mediathek eines Mediums zu aktivieren
MediaLibraryService
der App.
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 in der Inhaltsbibliothek der Medien-App zu stöbern, rufen Sie zuerst den Root-Knoten ab
mit getLibraryRoot()
:
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 können Sie durch die Mediathek navigieren, indem Sie die untergeordneten Elemente eines
MediaItem
in der Bibliothek mit getChildren()
. Um beispielsweise den
untergeordnetes Element des Stammknotens MediaItem
:
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());