Aplikasi yang memutar media memerlukan komponen antarmuka pengguna untuk menampilkan media dan mengontrol pemutaran. Library Media3 menyertakan modul UI yang berisi sejumlah komponen UI. Untuk bergantung pada modul UI, tambahkan dependensi berikut:
Kotlin
implementation("androidx.media3:media3-ui:1.4.1")
Groovy
implementation "androidx.media3:media3-ui:1.4.1"
Komponen terpenting adalah PlayerView
, tampilan untuk pemutaran media.
PlayerView
menampilkan video, gambar, subtitel, dan sampul album selama pemutaran,
serta kontrol pemutaran.
PlayerView
memiliki metode setPlayer
untuk melampirkan dan melepaskan (dengan
meneruskan null
) instance pemutar.
Tampilan Pemutar
PlayerView
dapat digunakan untuk pemutaran video, gambar, dan audio. Library ini merender
video dan subtitel dalam kasus pemutaran video, bitmap untuk pemutaran gambar,
dan dapat menampilkan karya seni yang disertakan sebagai metadata dalam file audio. Anda dapat menyertakannya
dalam file tata letak seperti komponen UI lainnya. Misalnya, PlayerView
dapat disertakan dengan XML berikut:
<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"/>
Cuplikan di atas mengilustrasikan bahwa PlayerView
menyediakan beberapa
atribut. Atribut ini dapat digunakan untuk menyesuaikan perilaku tampilan, serta
tampilan dan nuansanya. Sebagian besar atribut ini memiliki metode
penyetel yang sesuai, yang dapat digunakan untuk menyesuaikan tampilan saat runtime. Javadoc
PlayerView
mencantumkan atribut dan metode penyetel ini secara
lebih mendetail.
Setelah dideklarasikan dalam file tata letak, tampilan tersebut dapat dicari dalam
metode onCreate
aktivitas:
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); }
Setelah diinisialisasi, pemutar dapat dilampirkan ke tampilan dengan memanggil
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();
Memilih jenis platform
Atribut surface_type
dari PlayerView
memungkinkan Anda menetapkan jenis platform
yang digunakan untuk pemutaran video. Selain nilai spherical_gl_surface_view
(yang
adalah nilai khusus untuk pemutaran video sferis) dan
video_decoder_gl_surface_view
(yang digunakan untuk rendering video menggunakan perender
ekstensi), nilai yang diizinkan adalah surface_view
, texture_view
, dan none
. Jika
tampilan hanya untuk pemutaran audio, none
harus digunakan agar tidak perlu
membuat platform karena melakukannya dapat mahal.
Jika tampilan ditujukan untuk pemutaran video reguler, surface_view
atau texture_view
harus digunakan. SurfaceView
memiliki sejumlah manfaat dibandingkan TextureView
untuk
pemutaran video:
- Secara signifikan menurunkan konsumsi daya di banyak perangkat.
- Pengaturan waktu frame yang lebih akurat, sehingga menghasilkan pemutaran video yang lebih lancar.
- Dukungan untuk output video HDR berkualitas lebih tinggi di perangkat yang kompatibel.
- Dukungan untuk output yang aman saat memutar konten yang dilindungi DRM.
- Kemampuan untuk merender konten video pada resolusi penuh layar di perangkat Android TV yang meningkatkan kualitas lapisan UI.
Oleh karena itu, SurfaceView
harus lebih diprioritaskan daripada TextureView
jika memungkinkan.
TextureView
hanya boleh digunakan jika SurfaceView
tidak memenuhi kebutuhan Anda. Salah satu
contohnya adalah saat animasi yang halus atau scroll platform video diperlukan
sebelum Android 7.0 (API level 24), seperti dijelaskan dalam catatan berikut. Untuk
kasus ini, sebaiknya gunakan TextureView
hanya jika SDK_INT
kurang
dari 24 (Android 7.0) dan SurfaceView
jika tidak.
Navigasi D-pad di Android TV
Remote control Android TV memiliki kontrol D-pad yang mengirim perintah yang
datang sebagai peristiwa tombol di dispatchKeyEvent(KeyEvent)
dari Activity
Anda. Hal ini
perlu didelegasikan ke tampilan pemutar:
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); }
Meminta fokus untuk tampilan pemutar penting untuk menavigasi kontrol pemutaran
dan melewati iklan. Pertimbangkan untuk meminta fokus di onCreate
dari
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(); // ... }
Jika menggunakan Compose di Android TV, Anda harus membuat AndroidView
dapat difokuskan dan mendelegasikan peristiwa dengan meneruskan parameter pengubah ke
AndroidView
:
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
Mengganti drawable
PlayerView
menggunakan PlayerControlView
untuk menampilkan kontrol
pemutaran dan status progres. Drawable yang digunakan oleh PlayerControlView
dapat
ditimpa oleh drawable dengan nama yang sama yang ditentukan dalam aplikasi Anda. Lihat
Javadoc PlayerControlView
untuk mengetahui daftar drawable kontrol yang
dapat diganti.
Penyesuaian lebih lanjut
Jika penyesuaian di luar penjelasan di atas diperlukan, kami berharap developer aplikasi akan mengimplementasikan komponen UI-nya sendiri, bukan menggunakan komponen yang disediakan oleh modul UI Media3.