Một ứng dụng phát nội dung nghe nhìn cần có các thành phần giao diện người dùng để hiển thị nội dung nghe nhìn và kiểm soát việc phát nội dung. Thư viện Media3 bao gồm một mô-đun giao diện người dùng chứa một số thành phần giao diện người dùng. Để phụ thuộc vào mô-đun giao diện người dùng, hãy thêm phần phụ thuộc sau:
Kotlin
implementation("androidx.media3:media3-ui:1.3.1")
Groovy
implementation "androidx.media3:media3-ui:1.3.1"
Thành phần quan trọng nhất là PlayerView
, một khung hiển thị để phát nội dung nghe nhìn.
PlayerView
hiển thị video, phụ đề và ảnh bìa đĩa nhạc trong khi phát cũng như các bộ điều khiển chế độ phát.
PlayerView
có phương thức setPlayer
để đính kèm và tách (bằng cách truyền null
) các thực thể người chơi.
Chế độ xem trình phát
Có thể dùng PlayerView
để phát cả video và âm thanh. Ứng dụng này kết xuất video và phụ đề trong trường hợp phát video, đồng thời có thể hiển thị hình minh hoạ được đưa vào dưới dạng siêu dữ liệu trong tệp âm thanh. Bạn có thể đưa nó vào tệp bố cục như mọi thành phần giao diện người dùng khác. Ví dụ: bạn có thể đưa PlayerView
vào mã XML sau:
<androidx.media3.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:show_buffering="when_playing"
app:show_shuffle_button="true"/>
Đoạn mã trên minh hoạ rằng PlayerView
cung cấp một số thuộc tính. Bạn có thể dùng các thuộc tính này để tuỳ chỉnh hành vi của thành phần hiển thị, cũng như giao diện của thành phần hiển thị đó. Hầu hết các thuộc tính này đều có phương thức setter tương ứng, có thể dùng để tuỳ chỉnh khung hiển thị trong thời gian chạy. Javadoc PlayerView
liệt kê các thuộc tính và phương thức setter chi tiết hơn.
Sau khi khai báo khung hiển thị trong tệp bố cục, bạn có thể tra cứu khung hiển thị đó trong phương thức onCreate
của hoạt động:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView = findViewById(R.id.player_view) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView = findViewById(R.id.player_view); }
Khi khởi động, trình phát có thể được đính kèm vào khung hiển thị bằng cách gọi setPlayer
:
Kotlin
// Instantiate the player. val player = ExoPlayer.Builder(context).build() // Attach player to the view. playerView.player = player // Set the media item to be played. player.setMediaItem(mediaItem) // Prepare the player. player.prepare()
Java
// Instantiate the player. player = new ExoPlayer.Builder(context).build(); // Attach player to the view. playerView.setPlayer(player); // Set the media item to be played. player.setMediaItem(mediaItem); // Prepare the player. player.prepare();
Chọn một loại nền tảng
Thuộc tính surface_type
của PlayerView
cho phép bạn thiết lập loại nền tảng dùng để phát video. Bên cạnh các giá trị spherical_gl_surface_view
(là giá trị đặc biệt để phát video hình cầu) và video_decoder_gl_surface_view
(dành cho kết xuất video bằng trình kết xuất tiện ích), các giá trị được phép là surface_view
, texture_view
và none
. Nếu khung hiển thị chỉ dành cho việc phát âm thanh, bạn nên sử dụng none
để tránh phải tạo nền tảng vì việc này có thể gây tốn kém.
Nếu khung hiển thị dùng để phát video thông thường, thì bạn nên sử dụng surface_view
hoặc texture_view
. So với TextureView
đối với việc phát video, SurfaceView
có một số lợi ích như sau:
- Mức tiêu thụ điện năng thấp hơn đáng kể trên nhiều thiết bị.
- Thời gian kết xuất khung hình chính xác hơn, giúp video phát mượt mà hơn.
- Hỗ trợ đầu ra video HDR chất lượng cao hơn trên các thiết bị hỗ trợ.
- Hỗ trợ đầu ra an toàn khi phát nội dung được bảo vệ bằng DRM.
- Khả năng kết xuất nội dung video ở độ phân giải đầy đủ của màn hình trên các thiết bị Android TV nâng cấp lớp giao diện người dùng.
Do đó, bạn nên ưu tiên SurfaceView
hơn TextureView
nếu có thể.
Bạn chỉ nên sử dụng TextureView
nếu SurfaceView
không đáp ứng được nhu cầu của bạn. Một ví dụ là trường hợp bắt buộc phải có ảnh động mượt mà hoặc cuộn giao diện video mượt mà trước Android 7.0 (API cấp 24), như mô tả trong các ghi chú sau. Trong trường hợp này, bạn chỉ nên sử dụng TextureView
khi SDK_INT
thấp hơn 24 (Android 7.0) và nếu không thì SurfaceView
.
Điều hướng bằng D-pad trên Android TV
Điều khiển từ xa của Android TV có phần điều khiển D-pad để gửi các lệnh đến dưới dạng sự kiện phím tại dispatchKeyEvent(KeyEvent)
trên Activity
. Các dữ liệu này cần được uỷ quyền trong chế độ xem của trình phát:
Kotlin
override fun dispatchKeyEvent(event: KeyEvent?): Boolean{ return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event) }
Java
@Override public boolean dispatchKeyEvent(KeyEvent event) { return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event); }
Việc yêu cầu lấy tiêu điểm cho chế độ xem trình phát là rất quan trọng để di chuyển các nút điều khiển chế độ phát và bỏ qua quảng cáo. Hãy cân nhắc việc yêu cầu tiêu điểm trong onCreate
của Activity
:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView.requestFocus() // ... }
Java
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView.requestFocus(); // ... }
Nếu đang sử dụng Compose trên Android TV, bạn cần đặt AndroidView
làm tâm điểm và uỷ quyền sự kiện bằng cách truyền tham số đối tượng sửa đổi vào AndroidView
tương ứng:
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
Ghi đè đối tượng có thể vẽ
PlayerView
sử dụng PlayerControlView
để hiển thị các nút điều khiển chế độ phát và thanh tiến trình. Bạn có thể ghi đè các đối tượng có thể vẽ mà PlayerControlView
sử dụng bằng các đối tượng có thể vẽ bằng cùng tên được xác định trong ứng dụng của bạn. Hãy xem Javadoc PlayerControlView
để biết danh sách các đối tượng điều khiển có thể ghi đè.
Tuỳ chỉnh thêm
Khi yêu cầu tuỳ chỉnh ngoài phạm vi mô tả ở trên, chúng tôi kỳ vọng rằng nhà phát triển ứng dụng sẽ triển khai các thành phần giao diện người dùng của riêng họ thay vì sử dụng các thành phần do mô-đun giao diện người dùng của Media3 cung cấp.