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 đa phương tiện tương tác với một phiên nội dung đa phương tiện để truy vấn và điều khiển hoạt động phát của ứng dụng đa phương tiện. Trong Media3, API MediaController sẽ triển khai giao diện Player. Sau đây là ví dụ về ứng dụng khách sử dụng trình điều khiển nội dung đa phương tiện:

Trình điều khiển nội dung đa phương tiệ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 đa phương tiện nằm trong một Service tách biệt với Activity hoặc Fragment có giao diện người dùng.

Tạo một MediaController

Để tạo MediaController, hãy bắt đầu bằng cách tạo SessionToken cho MediaSession tương ứng. Phương thức onStart() của Activity hoặc Fragment có thể là nơi phù hợp để thực hiện 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 nhất định. Quá trình 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ó sẵn.

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

Sử dụng một MediaController

MediaController triển khai giao diện Player, vì vậy, bạn có thể sử dụng các lệnh được xác định trong giao diện đó để điều khiển chế độ phát MediaSession đã kết nối. Nói cách khác, việc gọi play() trên 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.

Tương tự, bạn có thể thêm Player.Listener vào tay điều khiển để theo dõi các thay đổi ở trạng thái Player. 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 đến từ MediaSession được kết nối, chẳng hạn như onAvailableSessionCommandsChanged() dùng khi phiên phát nội dung đa phương tiện thay đổi các lệnh phiên có sẵn và onDisconnected() khi trình điều khiển bị ngắt kết nối khỏi phiên.

Giống như các thành phần khác, hãy nhớ giải phóng MediaController khi không còn cần đến 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 thả tay điều khiển sẽ vẫn phân phối tất cả các lệnh đang chờ xử lý được gửi đến phiên và chỉ huỷ liên kết với dịch vụ phiên sau khi những 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 tính năng mà MediaController cung cấp để cho phép bạn duyệt qua thư viện nội dung nghe nhì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 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 đa phương tiện bằng cách truy xuất phần tử con của 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());