Mit einer Medien-App verbinden

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:

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());