Mulai dari Android 8.0 (API level 26), MediaPlayer
menyertakan API yang
mendukung pemutaran materi yang dilindungi DRM. API DRM MediaPlayer
mirip dengan API level rendah yang disediakan oleh MediaDrm
, tetapi beroperasi pada
level yang lebih tinggi dan tidak mengekspos objek kripto, DRM, dan ekstraktor yang mendasarinya.
Meskipun tidak menyediakan fungsionalitas penuh
MediaDrm
, MediaPlayer DRM API mendukung kasus penggunaan yang paling umum. Penerapan
saat ini dapat menangani jenis konten berikut:
- File media lokal yang dilindungi Widevine
- File media jarak jauh atau streaming yang dilindungi Widevine
Cuplikan kode berikut menunjukkan cara menggunakan metode DRM MediaPlayer
yang baru dalam penerapan sinkron.
Untuk mengelola media yang dikontrol DRM, Anda harus menyertakan metode baru tersebut bersama alur biasa pemanggilan MediaPlayer, seperti yang ditunjukkan dalam contoh ini:
Kotlin
mediaPlayer?.apply {
setDataSource()
setOnDrmConfigHelper() // optional, for custom configuration
prepare()
drmInfo?.also {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
// MediaPlayer is now ready to use
start()
// ...play/pause/resume...
stop()
releaseDrm()
}
Java
setDataSource();
setOnDrmConfigHelper(); // optional, for custom configuration
prepare();
if (getDrmInfo() != null) {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// MediaPlayer is now ready to use
start();
// ...play/pause/resume...
stop();
releaseDrm();
Mulailah dengan menginisialisasi objek MediaPlayer
dan menetapkan sumbernya menggunakan
setDataSource()
, seperti biasa. Kemudian, untuk menggunakan DRM, lakukan langkah-langkah berikut:
- Jika ingin aplikasi Anda melakukan konfigurasi kustom, tentukan
antarmuka
OnDrmConfigHelper
, lalu lampirkan ke pemutar menggunakansetOnDrmConfigHelper()
. - Panggil
prepare()
. - Panggil
getDrmInfo()
. Jika sumbernya memiliki konten DRM, metode tersebut akan menampilkan nilaiMediaPlayer.DrmInfo
non-null.
Jika MediaPlayer.DrmInfo
ada:
- Periksa peta UUID yang tersedia dan pilih salah satunya.
- Persiapkan konfigurasi DRM untuk sumber saat ini dengan memanggil
prepareDrm()
.- Jika Anda membuat dan mendaftarkan callback
OnDrmConfigHelper
, callback tersebut akan dipanggil saatprepareDrm()
dieksekusi. Hal ini memungkinkan Anda melakukan konfigurasi kustom properti DRM sebelum membuka sesi DRM. Callback dipanggil secara sinkron dalam thread yang memanggilprepareDrm()
. Untuk mengakses properti DRM, panggilgetDrmPropertyString()
dansetDrmPropertyString()
. Hindari melakukan operasi yang panjang. - Jika perangkat belum disediakan,
prepareDrm()
juga akan mengakses server penyediaan untuk menyediakan perangkat. Proses ini dapat memakan waktu yang bervariasi, bergantung pada konektivitas jaringan.
- Jika Anda membuat dan mendaftarkan callback
- Untuk mendapatkan array byte permintaan kunci opaque yang akan dikirim ke server lisensi, panggil
getKeyRequest()
. - Untuk memberi tahu mesin DRM tentang respons kunci yang diterima dari server
lisensi, panggil
provideKeyResponse()
. Hasilnya bergantung pada jenis permintaan kunci:- Jika respons ditujukan untuk permintaan kunci offline, hasilnya akan berupa ID rangkaian kunci. Anda dapat menggunakan ID kumpulan kunci ini dengan
restoreKeys()
untuk memulihkan kunci ke sesi baru. - Jika respons ditujukan untuk permintaan streaming atau rilis, hasilnya adalah null.
- Jika respons ditujukan untuk permintaan kunci offline, hasilnya akan berupa ID rangkaian kunci. Anda dapat menggunakan ID kumpulan kunci ini dengan
Menyiapkan DRM secara asinkron
Secara default, prepareDrm()
berjalan secara sinkron, yang melakukan pemblokiran hingga persiapan
selesai. Namun, persiapan DRM pada kali pertama di perangkat baru juga mungkin
memerlukan penyediaan, yang ditangani secara internal oleh prepareDrm()
, dan mungkin memerlukan
waktu lama untuk diselesaikan karena melibatkan operasi jaringan. Anda dapat menghindari
pemblokiran pada prepareDrm()
dengan menentukan dan menetapkan
MediaPlayer.OnDrmPreparedListener
.
Tetapkan OnDrmPreparedListener
. prepareDrm()
melakukan
penyediaan (jika diperlukan) dan persiapan di latar belakang. Setelah penyediaan
dan persiapan selesai, sistem akan memanggil pemroses. Jangan membuat
asumsi apa pun tentang urutan pemanggilan atau thread tempat pemroses berjalan
(kecuali jika Anda mendaftarkan pemroses dengan thread pengendali). Sistem dapat memanggil pemroses sebelum atau setelah prepareDrm()
ditampilkan.
Menyiapkan DRM secara asinkron
Anda dapat melakukan inisialisasi DRM secara asinkron dengan membuat dan mendaftarkan
MediaPlayer.OnDrmInfoListener
untuk persiapan DRM dan
MediaPlayer.OnDrmPreparedListener
untuk memulai pemutar. Keduanya berfungsi
bersama dengan prepareAsync()
, seperti yang ditunjukkan dalam contoh ini:
Kotlin
setOnPreparedListener()
setOnDrmInfoListener()
setDataSource()
prepareAsync()
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) {
mediaPlayer.apply {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
override fun onPrepared(mediaPlayer: MediaPlayer) {
mediaPlayer.start()
}
Java
setOnPreparedListener();
setOnDrmInfoListener();
setDataSource();
prepareAsync();
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
onDrmInfo() {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
onPrepared() {
start();
}
Menangani media terenkripsi
Mulai dari Android 8.0 (API level 26), MediaPlayer
juga dapat mendekripsi Common
Encryption Scheme (CENC) dan media yang dienkripsi dengan level sampel HLS
(METHOD=SAMPLE-AES) untuk jenis streaming dasar H.264, dan AAC. Media terenkripsi segmen penuh (METHOD=AES-128) sebelumnya didukung.
Pelajari lebih lanjut
Jetpack Media3 adalah solusi yang direkomendasikan untuk pemutaran media di aplikasi Anda. Baca selengkapnya tentang hal ini.
Halaman ini membahas topik yang berkaitan dengan perekaman, penyimpanan, dan pemutaran kembali audio dan video: