Kết nối với một ứng dụng đa phương tiện

Trình điều khiển nội dung nghe nhìn tương tác với một phiên nội dung nghe nhìn để truy vấn và kiểm soát hoạt động phát của một ứng dụng nội dung nghe nhìn. Trong Media3, API MediaController triển khai giao diện Player. Sau đây là ví dụ về các ứng dụng khách sử dụng bộ điều khiển nội dung nghe nhìn:

Trình điều khiển nội dung nghe nhìn cũng có thể hữu ích trong một ứng dụng đa phương tiện, chẳng hạn như nếu trình phát và phiên phát nội dung nghe nhìn nằm trong một Service riêng biệt với Activity hoặc Fragment có giao diện người dùng.

Tạo một MediaController

Để tạo một MediaController, hãy bắt đầu bằng cách tạo một SessionToken cho MediaSession tương ứng. Phương thức onStart() của Activity hoặc Fragment có thể là một nơi phù hợp cho việc này.

Kotlin

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

Java

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

Việc sử dụng SessionToken này để tạo MediaController sẽ kết nối bộ điều khiển với phiên đã cho. Thao tác này diễn ra không đồng bộ, vì vậy, bạn nên theo dõi kết quả và sử dụng kết quả đó khi có.

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

Dùng MediaController

MediaController triển khai giao diện Player, vì vậy, bạn có thể dùng các lệnh được xác định trong giao diện này để kiểm soát chế độ phát của MediaSession đã kết nối. Điều này có nghĩa là việc gọi play() trên một MediaController sẽ gửi lệnh đến MediaSession được kết nối, sau đó sẽ uỷ quyền lệnh cho Player cơ bản của lệnh.

Bạn có thể thêm một Player.Listener vào bộ điều khiển để theo dõi các thay đổi về trạng thái Player. Hãy tham khảo hướng dẫn về Sự kiện của người chơi để biết thêm thông tin chi tiết về cách sử dụng Player.Listener.

Giao diện MediaController.Listener xác định các lệnh gọi lại bổ sung cho các sự kiện và lệnh tuỳ chỉnh từ MediaSession được kết nối. Ví dụ: onCustomCommand() khi phiên gửi một lệnh tuỳ chỉnh, onAvailableSessionCommandsChanged() khi phiên thay đổi các lệnh phiên hiện có hoặc onDisconnected() khi bộ điều khiển bị ngắt kết nối khỏi phiên.

Bạn có thể đặt MediaController.Listener khi tạo bộ điều khiển bằng Builder:

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

Giống như các thành phần khác, hãy nhớ phát hành MediaController khi không cần đến thành phần này nữa, chẳng hạn như trong phương thức onStop() của Activity hoặc Fragment.

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

Việc nhả bộ điều khiển vẫn sẽ gửi tất cả các lệnh đang chờ xử lý đã gửi đến phiên và chỉ huỷ liên kết khỏi dịch vụ phiên một lần sau khi các lệnh này được xử lý hoặc sau một khoảng thời gian chờ, tuỳ theo điều kiện nào xảy ra trước.

Tạo và sử dụng MediaBrowser

MediaBrowser được xây dựng dựa trên các chức năng do MediaController cung cấp để cho phép duyệt qua thư viện nội dung đa phương tiện do MediaLibraryService của ứng dụng đa phương tiện cung cấp.

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

Để bắt đầu duyệt xem thư viện nội dung của ứng dụng đa phương tiện, trước tiên, hãy truy xuất nút gốc bằng 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());

Sau đó, bạn có thể di chuyển qua thư viện nội dung nghe nhìn bằng cách truy xuất các phần tử con của một MediaItem trong thư viện bằng getChildren(). Ví dụ: để truy xuất các phần tử con của nút gốc 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());

Hiện các chế độ phát cho một ứng dụng nghe nhìn khác

Khi hiển thị các thành phần điều khiển trên giao diện người dùng có nút cho một ứng dụng đa phương tiện khác, bạn cần tuân theo các lựa chọn ưu tiên về nút đa phương tiện đã khai báo của ứng dụng đó.

Cách tốt nhất để giải quyết các lựa chọn ưu tiên của ứng dụng cũng như các ràng buộc và yêu cầu của giao diện người dùng là sử dụng CommandButton.DisplayConstraints. Bạn có thể xác định các giới hạn và hạn chế mà giao diện người dùng có thể thực hiện, đồng thời phương thức resolve cung cấp một danh sách nút cụ thể để hiển thị cùng với biểu tượng, vị trí và hành động dự kiến của nút.