Подключитесь к мультимедийному приложению

Медиа-контроллер взаимодействует с медиа-сеансом для запроса и управления воспроизведением мультимедийного приложения. В Media3 API MediaController реализует интерфейс Player . Примеры клиентских приложений, использующих медиаконтроллер, включают:

Медиа-контроллер также может быть полезен в медиа-приложении, например, если проигрыватель и медиа-сеанс находятся в Service , отдельном от Activity или Fragment с пользовательским интерфейсом.

Создайте MediaController

Чтобы создать MediaController , начните с создания SessionToken для соответствующего MediaSession . Метод onStart() вашего Activity или Fragment может быть хорошим местом для этого.

Котлин

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

Ява

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

Использование этого SessionToken для последующего создания MediaController подключает контроллер к данному сеансу. Это происходит асинхронно, поэтому вам следует прослушивать результат и использовать его, когда он доступен.

Котлин

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

MediaController реализует интерфейс Player , поэтому вы можете использовать команды, определенные в интерфейсе, для управления воспроизведением подключенного MediaSession . Это означает, что вызов play() в MediaController отправит команду подключенному MediaSession , который впоследствии делегирует команду своему базовому Player .

Аналогичным образом вы можете добавить Player.Listener к контроллеру, чтобы прослушивать изменения в состоянии Player . Дополнительные сведения об использовании Player.Listener см. в руководстве по событиям Player . Интерфейс MediaController.Listener определяет дополнительные обратные вызовы для событий и входящих команд из подключенного MediaSession , например onAvailableSessionCommandsChanged() , когда медиа-сеанс изменяет доступные команды сеанса, и onDisconnected() , когда контроллер отключается от сеанса.

Как и в случае с другими компонентами, не забудьте освободить MediaController , когда он больше не нужен, например, в методе onStop() Activity или Fragment .

Котлин

MediaController.releaseFuture(controllerFuture)

Ява

MediaController.releaseFuture(controllerFuture);

Освобождение контроллера по-прежнему будет доставлять все ожидающие команды, отправленные в сеанс, и отменять привязку от службы сеанса только после обработки этих команд или по истечении периода ожидания, в зависимости от того, что наступит раньше.

Создайте и используйте MediaBrowser

MediaBrowser опирается на возможности, предлагаемые MediaController , и позволяет также просматривать медиатеку, предлагаемую MediaLibraryService медиаприложения.

Котлин

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

Чтобы начать просмотр библиотеки контента медиа-приложения, сначала получите корневой узел с помощью 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());

Затем вы можете перемещаться по медиатеке, получая дочерние элементы MediaItem в библиотеке с помощью getChildren() . Например, чтобы получить дочерние элементы корневого узла 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());