Mit einer Medien-App verbinden

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:

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