Mulai menggunakan Media Player

Dokumen ini memperkenalkan konsep dasar yang harus Anda pahami sebelum menggunakan Media Player.

Class suara dan video

Class berikut memutar suara dan video dalam framework Android:

  • MediaPlayer: Class ini adalah API utama untuk memutar suara dan video.
  • AudioManager: Class ini mengelola sumber audio dan output audio di perangkat.

Deklarasi manifes

Sebelum mulai mengembangkan aplikasi menggunakan MediaPlayer, pastikan manifes Anda memiliki deklarasi yang sesuai untuk mengizinkan penggunaan fitur terkait.

  • Izin Internet: Jika Anda menggunakan MediaPlayer untuk melakukan streaming konten berbasis jaringan, aplikasi Anda harus meminta akses jaringan.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • Izin Penguncian Layar Saat Aktif: Jika aplikasi pemutar Anda mengharuskan layar tetap menyala atau mengharuskan prosesor tetap bekerja, atau menggunakan MediaPlayer.setScreenOnWhilePlaying(boolean) atau MediaPlayer.setWakeMode(android.content.Context, int) metode, Anda harus meminta izin ini.

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

Menggunakan class MediaPlayer

Class MediaPlayer adalah komponen penting dari framework media. Objek class ini dapat mengambil, mendekode, serta memutar audio dan video dengan sedikit penyiapan. MediaPlayer mendukung beberapa sumber media, termasuk:

  • Resource lokal
  • URI internal, seperti yang mungkin Anda peroleh dari Content Resolver
  • URL eksternal (streaming)

Untuk daftar format media yang didukung Android, lihat halaman Format Media yang Didukung.

Contoh penggunaan sumber audio

Berikut contoh cara memutar audio yang tersedia sebagai resource mentah lokal (disimpan dalam direktori res/raw/ aplikasi Anda):

Kotlin

var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you

Java

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you

Dalam hal ini, resource "mentah" adalah file yang tidak akan diuraikan oleh sistem dengan cara khusus apa pun. Namun, konten resource ini tidak boleh berupa audio mentah. Konten ini harus berupa file media yang dienkode dan diformat dengan benar dalam salah satu format yang didukung.

Berikut adalah cara melakukan pemutaran dari URI yang tersedia secara lokal dalam sistem (yang diperoleh melalui Content Resolver, misalnya):

Kotlin

val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(applicationContext, myUri)
    prepare()
    start()
}

Java

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

Melakukan pemutaran dari URL jarak jauh menggunakan streaming HTTP akan terlihat seperti ini:

Kotlin

val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(url)
    prepare() // might take long! (for buffering, etc)
    start()
}

Java

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();

Menggunakan persiapan Asinkron untuk meningkatkan performa

Perhatikan performa saat Anda menggunakan MediaPlayer. Contohnya, panggilan ke prepare() dapat membutuhkan waktu lama untuk dieksekusi karena mungkin memerlukan pengambilan dan dekode data media. Jadi, seperti semua metode yang memerlukan waktu lama untuk dieksekusi, Anda tidak boleh memanggilnya dari UI thread aplikasi. Jika dilakukan, UI akan berhenti merespons sampai metode kembali, yang merupakan pengalaman pengguna yang buruk dan dapat menyebabkan error ANR (Application Not Responding).

Untuk menghindari UI thread yang tidak merespons, buat thread lain untuk mempersiapkan MediaPlayer dan beri tahu thread utama setelah selesai. Framework menyediakan cara mudah untuk menyelesaikan metode prepareAsync() untuk melakukan tugas ini. Metode ini mulai mempersiapkan media di latar belakang dan langsung ditampilkan. Setelah media selesai dipersiapkan, metode onPrepared() dari MediaPlayer.OnPreparedListener, yang dikonfigurasi melalui setOnPreparedListener() akan dipanggil.

Pelajari lebih lanjut

Jetpack Media3 adalah solusi yang direkomendasikan untuk pemutaran media di aplikasi Anda. Baca selengkapnya.

Halaman ini membahas topik yang berkaitan dengan perekaman, penyimpanan, dan pemutaran kembali audio dan video: