Połącz z aplikacją do multimediów

Z aplikacją multimedialną możesz połączyć się na 2 sposoby:

  1. MediaController
  2. MediaBrowser

MediaController

Kontroler multimediów wchodzi w interakcję z sesją multimedialną, aby wysyłać zapytania i sterować odtwarzaniem w aplikacji multimedialnej. W Media3 interfejs API MediaController implementuje interfejs Player. Przykłady aplikacji klienckich, które używają kontrolera multimediów:

Kontroler multimediów może być też przydatny w aplikacji multimedialnej, na przykład jeśli odtwarzacz i sesja multimedialna znajdują się w Service oddzielnym od Activity lub Fragment z interfejsem.

Tworzenie MediaController

Aby utworzyć MediaController, zacznij od utworzenia SessionToken dla odpowiedniego MediaSession. Dobrym miejscem na to może być onStart() Twojego Activity lub Fragment.

Kotlin

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

Java

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

Użycie tego SessionToken do utworzenia MediaController łączy kontroler z daną sesją. Odbywa się to asynchronicznie, więc musisz nasłuchiwać wyniku i używać go, gdy będzie dostępny.

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

Użyj MediaController

MediaController implementuje interfejs Player, więc możesz używać poleceń zdefiniowanych w tym interfejsie do sterowania odtwarzaniem podłączonego urządzenia MediaSession. Oznacza to, że wywołanie play() na urządzeniu MediaController spowoduje wysłanie polecenia do połączonego urządzenia MediaSession, które następnie przekaże polecenie do urządzenia Player.

Możesz dodać Player.Listener do kontrolera, aby monitorować zmiany stanu Player. Więcej informacji o używaniu elementu Player.Listener znajdziesz w przewodniku Zdarzenia odtwarzacza.

Interfejs MediaController.Listener definiuje dodatkowe wywołania zwrotne dla zdarzeń i niestandardowych poleceń z podłączonego MediaSession. Przykłady to:onCustomCommand() gdy sesja wysyła polecenie niestandardowe,onAvailableSessionCommandsChanged() gdy sesja zmienia dostępne polecenia sesji lub onDisconnected() gdy kontroler jest odłączony od sesji.

Podczas tworzenia kontrolera za pomocą metody Builder można ustawić MediaController.Listener:

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

Podobnie jak w przypadku innych komponentów, pamiętaj, aby zwolnić MediaController, gdy nie jest już potrzebny, np. w metodzie onStop() obiektu Activity lub Fragment.

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

Zwolnienie kontrolera nadal będzie powodować dostarczanie wszystkich oczekujących poleceń wysłanych do sesji i odłączenie od usługi sesji dopiero po obsłużeniu tych poleceń lub po upływie czasu oczekiwania (w zależności od tego, co nastąpi wcześniej).

MediaBrowser

MediaBrowser korzysta z funkcji oferowanych przez MediaController, a także umożliwia przeglądanie biblioteki multimediów oferowanej przez MediaLibraryService aplikacji multimedialnej.

Tworzenie MediaBrowser

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

Użyj MediaBrowser

Aby rozpocząć przeglądanie biblioteki treści aplikacji multimedialnej, najpierw pobierz węzeł główny za pomocą 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());

Następnie możesz poruszać się po bibliotece multimediów, pobierając elementy podrzędne elementu MediaItem w bibliotece za pomocą funkcji getChildren(). Aby na przykład pobrać elementy podrzędne węzła głównego 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());

Wyświetlanie elementów sterujących odtwarzaniem w innej aplikacji do odtwarzania multimediów

Podczas wyświetlania elementów sterujących interfejsu z przyciskami innej aplikacji multimedialnej ważne jest, aby przestrzegać zadeklarowanych ustawień przycisków multimedialnych tej aplikacji.

Najlepszym sposobem na rozwiązanie problemu z preferencjami aplikacji oraz ograniczeniami i wymaganiami interfejsu jest użycie CommandButton.DisplayConstraints. Możesz określić limity i ograniczenia interfejsu, a metoda resolve zawiera konkretną listę przycisków do wyświetlenia wraz z ikoną, pozycją i zamierzonym działaniem.