Trình điều khiển nội dung nghe nhìn tương tác với một phiên phát nội dung nghe nhìn để truy vấn và kiểm soát quá trình phát của ứ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 trình điều khiển nội dung nghe nhìn:
- Chế độ điều khiển nội dung đa phương tiện của hệ thống Android
- Ứng dụng đồng hành cho Android Wear OS
- Android Auto và Automotive OS
- Trợ lý thoại, chẳng hạn như Trợ lý Google
- Ứng dụng Kiểm thử trình đ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 ứng dụng đa phương tiện, ví dụ: nếu trình phát và phiên phát nội dung nghe nhìn nằm trong 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à một 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));
Sử dụng SessionToken
này để tạo MediaController
kết nối trình điều khiển với phiên đã cho. Quá trình này diễn ra không đồng bộ, vì vậy, bạn nên lắng nghe 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());
Sử dụng 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 của MediaSession
đã kết nối.
Điều này có nghĩa là việc gọi play()
trên MediaController
sẽ gửi lệnh đến MediaSession
đã kết nối, sau đó lệnh này sẽ uỷ quyền lệnh đó cho Player
cơ bản.
Tương tự, bạn có thể thêm Player.Listener
vào bộ điều khiển để theo dõi các thay đổi trong 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
đã kết nối, chẳng hạn như onAvailableSessionCommandsChanged()
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 tay điều khiển bị ngắt kết nối khỏi phiên.
Cũ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, 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 phát hành trình điều khiển vẫn sẽ 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 khỏi dịch vụ phiên sau khi các lệnh này được xử lý hoặc sau một khoảng thời gian chờ, tuỳ vào đ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 để cũng 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 thành phần con của MediaItem
trong thư viện bằng getChildren()
. Ví dụ: để truy xuất các 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 thị các nút điều khiển phát cho một ứng dụng đa phương tiệ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 bằng các nút cho một ứng dụng đa phương tiện khác, điều quan trọng là bạn phải tuân theo 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 tuỳ chọn của ứng dụng cũng như các quy tắ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 rõ ràng các nút để hiển thị cùng với biểu tượng, vị trí và hành động dự kiến.