Mit einer Medien-App verbinden

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:

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