Thêm bộ điều khiển chế độ phát vào ứng dụng

Ứ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 phần phụ thuộc sau:

implementation("androidx.media3:media3-ui:1.5.1")
implementation "androidx.media3:media3-ui:1.5.1"

Thành phần quan trọng nhất là PlayerView, một thành phần hiển thị để phát nội dung nghe nhìn. PlayerView hiển thị video, hình ảnh, phụ đề và ảnh bìa album trong khi phát, cũng như các nút điều khiển 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.

PlayerView

Có thể dùng PlayerView để phát cả video, hình ảnh và âm thanh. Thành phần này hiển thị video và phụ đề trong trường hợp phát video, bitmap để phát 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ể đưa thành phần này 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 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ể sử 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 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:

KotlinJava
override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView = findViewById(R.id.player_view)
}
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // ...
  playerView = findViewById(R.id.player_view);
}

Khi một người chơi đã được khởi chạy, bạn có thể đính kèm người chơi đó vào thành phần hiển thị bằng cách gọi setPlayer:

KotlinJava
// 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()
// 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 nền tảng dùng để phát video. Ngoài 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ùng để 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_viewnone. Nếu thành phần hiển thị chỉ dùng để phát âm thanh, bạn nên sử dụng none để tránh phải tạo một nền tảng vì việc này có thể tốn kém.

Nếu thành phần 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. 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 sử dụng SurfaceView thay vì 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. Để 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:

KotlinJava
override fun dispatchKeyEvent(event: KeyEvent?): Boolean{
  return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event)
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
  return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
}

Việc yêu cầu tiêu điểm cho thành phần hiển thị trình phát là rất quan trọng để điều hướng các nút điều khiển 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:

KotlinJava
override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView.requestFocus()
  // ...
}
@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 có thể lấy tiêu đ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 phát và thanh tiến trình. Các đối tượng có thể vẽ mà PlayerControlView sử dụng có thể bị ghi đè bởi các đối tượng có thể vẽ có cùng tên được xác định trong ứng dụng. 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

Trong trường hợp cần tuỳ chỉnh ngoài những tuỳ chỉnh được mô tả ở trên, chúng tôi dự kiến 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.