Ứ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à đang điều khiển quá trình phát. 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 đoạn mã sau phần phụ thuộc:
Kotlin
implementation("androidx.media3:media3-ui:1.4.1")
Groovy
implementation "androidx.media3:media3-ui:1.4.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, hình ảnh, phụ đề và ảnh bìa đĩa nhạc trong khi phát,
cũng như đ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
) bản sao người chơi.
Chế độ xem trình phát
Có thể dùng PlayerView
để phát cả video, hình ảnh và âm thanh. Kết xuất
video và phụ đề trong trường hợp phát lại video, bitmap để phát lại hình ảnh
và 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ể bao gồm
trong tệp bố cục như bất kỳ thành phần giao diện người dùng nào khác. Ví dụ: PlayerView
có thể được bao gồm với 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ố
. 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ị, như
cũng như giao diện của ứng dụng. Hầu hết các thuộc tính này đều có phương thức setter tương ứng
mà có thể dùng để tuỳ chỉnh khung hiển thị trong thời gian chạy. Chiến lược phát hành đĩa đơn
PlayerView
Javadoc liệt kê các thuộc tính này và phương thức setter trong
chi tiết hơn.
Sau khi khai báo thành phần hiển thị trong tệp bố cục, bạn có thể tra cứu thành phần 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 được khởi chạy, 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 đặt loại bề mặt
được dùng để phát lại video. Bên cạnh các giá trị spherical_gl_surface_view
(
là một giá trị đặc biệt đối với việc phát lại video hình cầu) và
video_decoder_gl_surface_view
(dành cho kết xuất video bằng tiện ích
trình kết xuất đồ hoạ), các giá trị được phép là surface_view
, texture_view
và none
. Nếu
khung hiển thị này chỉ dùng để phát âm thanh, bạn nên dùng none
để tránh phải
tạo bề mặt vì làm như vậy có thể tốn kém.
Nếu khung hiển thị dùng để phát video thông thường, thì surface_view
hoặc texture_view
nên sử dụng. SurfaceView
có một số lợi ích hơn TextureView
đối với
phát video:
- Giảm đáng kể công suất trên nhiều trang web 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 giúp 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à khi cần có hoạt ảnh mượt 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 đây. Cho
trong trường hợp này, bạn chỉ nên sử dụng TextureView
khi SDK_INT
nhỏ hơn
24 (Android 7.0) và SurfaceView
.
Điều hướng bằng D-pad trên Android TV
Điều khiển từ xa của Android TV có một bộ điều khiển D-pad để gửi lệnh
đến dưới dạng sự kiện chính tại dispatchKeyEvent(KeyEvent)
/Activity
. Các
cần được uỷ quyền ở chế độ xem 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à quan trọng để di chuyển trong quá trình phát
kiểm soá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ạo AndroidView
có thể làm tâm điểm và uỷ quyền sự kiện bằng cách truyền thông số đối tượng sửa đổi vào
AndroidView
cho phù hợp:
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ị nội dung phát
các nút điều khiển và thanh tiến trình. Các đối tượng có thể vẽ mà PlayerControlView
sử dụng có thể
sẽ bị ghi đè 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. Xem
Javadoc PlayerControlView
để biết danh sách các đối tượng điều khiển có thể vẽ
có thể bị ghi đè.
Tuỳ chỉnh thêm
Khi bắt buộc phải tuỳ chỉnh thêm những gì được mô tả ở trên, chúng tôi kỳ vọng rằng ứng dụng nhà phát triển 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 được cung cấp bằng mô-đun giao diện người dùng của Media3.