Mit einer Medien-App verbinden

Ein Mediacontroller 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 Mediacontroller verwenden:

Eine Mediensteuerung kann auch in einer Medien-App nützlich sein, z. B. wenn sich der Player und die Mediensitzung in einer Service befinden, die von der Activity oder Fragment mit der Benutzeroberfläche getrennt ist.

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.

Kotlin

val sessionToken =
  SessionToken(context, ComponentName(context, PlaybackService::class.java))

Java

SessionToken sessionToken =
  new SessionToken(context, new ComponentName(context, PlaybackService.class));

Wenn du dann mit diesem SessionToken einen MediaController erstellst, wird der Controller mit der angegebenen Sitzung verbunden. Dies geschieht asynchron. Sie sollten also auf das Ergebnis warten und es verwenden, sobald 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. 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.

Sie können dem Controller einen Player.Listener hinzufügen, um auf Änderungen des Player-Status zu warten. Weitere Informationen zur Verwendung von Player.Listener findest du im Hilfeartikel Player-Ereignisse.

Die MediaController.Listener-Oberfläche definiert zusätzliche Callbacks für Ereignisse und benutzerdefinierte Befehle vom verbundenen MediaSession. Beispiele sind onCustomCommand(), wenn die Sitzung einen benutzerdefinierten Befehl sendet, onAvailableSessionCommandsChanged(), wenn die Sitzung die verfügbaren Sitzungsbefehle ändert, oder onDisconnected(), wenn die Verbindung des Controllers zur Sitzung getrennt wird.

Eine MediaController.Listener kann beim Erstellen des Controllers mit einer Builder festgelegt werden:

Kotlin

MediaController.Builder(context, sessionToken)
    .setListener(
      object : MediaController.Listener {
        override fun onCustomCommand(
          controller: MediaController,
          command: SessionCommand,
          args: Bundle,
        ): ListenableFuture<SessionResult> {
          // Handle custom command.
          return Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
        }

        override fun onDisconnected(controller: MediaController) {
          // Handle disconnection.
        }
      }
    )
    .buildAsync()

Java

new MediaController.Builder(context, sessionToken)
    .setListener(
        new MediaController.Listener() {
          @Override
          public ListenableFuture<SessionResult> onCustomCommand(
              MediaController controller, SessionCommand command, Bundle args) {
            // Handle custom command.
            return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS));
          }

          @Override
          public void onDisconnected(MediaController controller) {
            // Handle disconnection.
          }
        })
    .buildAsync();

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.

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

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 zu durchsuchen, die von der 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());

Wenn du die Inhaltsbibliothek der Medien-App durchsuchen möchtest, musst du zuerst den Stammknoten mit getLibraryRoot() abrufen:

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

Du kannst dann durch die Mediathek navigieren, indem du mit getChildren() die untergeordneten Elemente einer MediaItem in der Mediathek abfragst. 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());

Wiedergabesteuerung für eine andere Medien-App anzeigen

Wenn Sie UI-Steuerelemente mit Schaltflächen für eine andere Medien-App anzeigen, müssen Sie die angegebenen Einstellungen für Medienschaltflächen dieser App einhalten.

Die beste Lösung für die Einstellungen der App und die Einschränkungen und Anforderungen Ihrer Benutzeroberfläche ist CommandButton.DisplayConstraints. Sie können Einschränkungen für die Funktionen Ihrer Benutzeroberfläche festlegen. Die Methode resolve enthält eine Liste der Schaltflächen, die angezeigt werden sollen, mit Symbol, Position und beabsichtigter Aktion.