Audio Focus — mekanisme Android yang mengatur penggunaan simultan output audio oleh beberapa aplikasi. Ini mencegah tumpang tindih suara: ketika satu aplikasi mulai memutar, sistem secara otomatis meredam atau menjeda aplikasi lain. Menurut Android Developer Guide, 2026, Audio Focus wajib untuk semua aplikasi yang memutar audio — tanpanya Google Play dapat menolak pembaruan.
Poin Utama
Audio Focus — adalah sistem arbitrase audio terpusat di Android. Ketika satu aplikasi meminta fokus, sistem memeriksa apakah ada „pemilik" fokus yang aktif dan mengirimnya pemberitahuan kehilangan. Pemilik dapat meredam suara (duck), menjeda pemutaran, atau mengabaikan — tergantung pada jenis fokus.
Sebelum Android 8.0, fokus dikelola melalui AudioManager.requestAudioFocus(callback, stream, durationHint). Mulai Android 8.0, muncullah AudioFocusRequest yang menambahkan kemampuan untuk menentukan jenis permintaan dan pemulihan fokus otomatis. Di Android 12, mekanisme ini diperkuat — semua pemutar media wajib menangani fokus dengan benar untuk publikasi di Google Play.
Menurut Google I/O 2024, sekitar 15% keluhan pengguna dalam ulasan aplikasi audio terkait dengan tumpang tindih suara. Implementasi Audio Focus yang benar menyelesaikan masalah ini dan meningkatkan pengalaman pengguna sebesar 30% dalam hal waktu mendengarkan.
Penting dipahami bahwa Audio Focus tidak mengelola pemutaran secara otomatis. Ia hanya memberi tahu aplikasi tentang peristiwa fokus. Aplikasi sendiri yang memutuskan: menjeda pemutar, menurunkan volume, atau melanjutkan pemutaran. Sistem tidak memaksa — ini adalah keputusan arsitektural yang diserahkan kepada pengembang.
Pengecualian adalah aplikasi navigasi (Google Maps, Yandex.Maps). Mereka dapat meminta fokus tipe AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, di mana pemutar yang ada diredam dan petunjuk suara berbunyi di atasnya. Setelah petunjuk selesai, pemutar secara otomatis memulihkan volume.
Sistem mempertahankan satu pemilik aktif fokus audio. Saat aplikasi baru meminta fokus, sistem menentukan prioritas dan mengirim peristiwa ke pemilik saat ini. Jika pemilik saat ini mengabaikan peristiwa dan terus memutar dengan keras, sistem tidak menerapkan sanksi — tanggung jawab sepenuhnya ada pada pemutar.
Permintaan fokus menyertakan parameter durationHint, yang memberi tahu sistem tentang perkiraan durasi: AUDIOFOCUS_GAIN (pemutaran panjang — musik, podcast), AUDIOFOCUS_GAIN_TRANSIENT (pemutaran singkat — suara notifikasi, navigasi), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (pemutaran singkat dengan izin untuk meredam pemutar yang ada).
Saat kehilangan fokus, aplikasi menerima salah satu dari tiga kode: AUDIOFOCUS_LOSS (kehilangan panjang — aplikasi lain memulai musik), AUDIOFOCUS_LOSS_TRANSIENT (kehilangan sementara — panggilan, notifikasi), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (kehilangan sementara dengan kemungkinan peredaman). Setiap kode memerlukan reaksi sendiri.
Pengguna mendengarkan musik di aplikasi A. Ada panggilan masuk — aplikasi B (telepon) meminta AUDIOFOCUS_GAIN_TRANSIENT. Sistem mengirim AUDIOFOCUS_LOSS_TRANSIENT ke aplikasi A. Pemutar menjeda. Setelah panggilan selesai, aplikasi B melepaskan fokus, sistem memberi tahu aplikasi A melalui AUDIOFOCUS_GAIN — pemutar melanjutkan pemutaran. Seluruh rantai berlangsung kurang dari 50 ms.
Pemilihan durationHint yang tepat — keputusan kunci dalam implementasi Audio Focus. Kesalahan dalam memilih jenis menyebabkan tumpang tindih suara, penghentian pemutar yang tidak perlu, atau iritasi pengguna.
| Jenis permintaan | Skenario | Reaksi pemilik |
|---|---|---|
| AUDIOFOCUS_GAIN | Memulai musik, podcast | AUDIOFOCUS_LOSS — pemutar harus berhenti |
| AUDIOFOCUS_GAIN_TRANSIENT | Panggilan, notifikasi suara | AUDIOFOCUS_LOSS_TRANSIENT — jeda |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | Petunjuk GPS, sinyal pendek | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — peredaman |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Pencarian suara, perekaman | AUDIOFOCUS_LOSS — penghentian total |
Duck — penurunan volume sementara pemutar utama ke 20–30% selama bunyi suara sekunder. Android menyediakan API untuk duck manual melalui AudioManager.adjustSuggestedStreamVolume, tetapi sebagian besar pemutar mengimplementasikan peredaman dengan cara mereka sendiri. Menurut Android Documentation (2026), pemrosesan duck tidak boleh lebih dari 3 detik, setelah itu volume dipulihkan.
Untuk implementasi Audio Focus yang benar, perlu dilakukan tiga langkah secara berurutan: membuat permintaan, meminta fokus sebelum pemutaran, dan menangani peristiwa di callback. Penggunaan AudioFocusRequestCompat dari AndroidX media memastikan kompatibilitas dengan semua versi Android.
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val focusRequest = AudioFocusRequestCompat.Builder()
.setFocusGain(AudioManagerCompat.AUDIOFOCUS_GAIN)
.setOnAudioFocusChangeListener(focusChangeListener)
.build()
val result = AudioManagerCompat.requestAudioFocus(audioManager, focusRequest)
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
startPlayback()
}
Permintaan fokus harus dilakukan sebelum memulai pemutaran setiap kali pengguna menekan Play. Jika hasilnya AUDIOFOCUS_REQUEST_GRANTED — mulailah memutar. Jika DENIED — tampilkan pesan kepada pengguna atau tunda pemutaran hingga fokus diperoleh.
private val focusChangeListener = AudioManager.OnAudioFocusChangeListener { focusChange ->
when (focusChange) {
AudioManager.AUDIOFOCUS_GAIN -> {
restoreVolume()
if (wasPlayingBeforeLoss) resumePlayback()
}
AudioManager.AUDIOFOCUS_LOSS -> {
pausePlayback()
wasPlayingBeforeLoss = false
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
pausePlayback()
wasPlayingBeforeLoss = true
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
duckVolume()
}
}
}
Dalam callback, penting untuk membedakan AUDIOFOCUS_LOSS dan AUDIOFOCUS_LOSS_TRANSIENT. Dalam kasus pertama, pemutar TIDAK boleh melanjutkan secara otomatis — pengguna secara eksplisit memulai audio lain. Dalam kasus kedua — dapat melanjutkan secara otomatis saat menerima AUDIOFOCUS_GAIN. Bendera wasPlayingBeforeLoss membantu mengingat apakah pemutaran perlu dipulihkan.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
Pemanggilan abandonAudioFocusRequest memberi tahu sistem bahwa aplikasi tidak lagi membutuhkan fokus. Penting untuk memanggilnya saat jeda dan penghentian pemutar. Jika fokus tidak dilepaskan, aplikasi lain yang meminta AUDIOFOCUS_GAIN tidak akan menerima LOSS dan suara akan tumpang tindih.
Penanganan kehilangan fokus yang benar — persyaratan utama untuk lulus tinjauan di Google Play. Penanganan yang salah menyebabkan ulasan negatif: pengguna mengeluh bahwa musik terus diputar selama panggilan atau di atas navigasi.
Saat menerima AUDIOFOCUS_LOSS, pemutar harus berhenti dan tidak melanjutkan sampai penekanan tombol Play secara eksplisit. Pada AUDIOFOCUS_LOSS_TRANSIENT (panggilan, notifikasi), pemutar menjeda dan melanjutkan secara otomatis saat fokus dipulihkan. Pada AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK, pemutar sementara menurunkan volume ke 20–30% selama audio eksternal.
Menurut Android Developer Guide (2026), duck harus diimplementasikan dengan mengalikan level volume AudioTrack saat ini dengan faktor 0,2–0,3. Jangan gunakan AudioManager.setStreamVolume — ini mengubah volume sistem dan memengaruhi aplikasi lain. Duck hanya dilakukan di sisi pemutar sendiri.
Pada panggilan masuk, sistem secara otomatis meminta AUDIOFOCUS_GAIN_TRANSIENT melalui aplikasi Telepon. Pemutar menerima AUDIOFOCUS_LOSS_TRANSIENT dan menjeda. Setelah panggilan selesai atau jika pengguna menolak panggilan, fokus kembali — pemutar secara otomatis melanjutkan pemutaran, jika itu adalah pemutar musik.
Untuk aplikasi navigasi (Google Maps), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK digunakan untuk petunjuk suara. Pemutar diredam selama 2–3 detik, kemudian volume dipulihkan. Jika pengguna mendengarkan podcast, bukan musik, lebih baik menjeda daripada duck — dalam podcast setiap detik penting.
Dalam praktiknya, pengembang menghadapi beberapa skenario standar di mana Audio Focus berperilaku berbeda. Mari kita lihat kasus umum dan reaksi yang benar terhadapnya.
Penting untuk mengimplementasikan bendera yang mengingat apakah musik diputar sebelum kehilangan fokus. Jika pengguna sendiri menjeda dan kemudian ada panggilan masuk — tidak perlu melanjutkan. Bendera direset pada jeda eksplisit pengguna dan disetel saat memulai pemutaran.
Menurut riset UX Google (2024), melanjutkan otomatis setelah panggilan meningkatkan kepuasan pengguna sebesar 22%. Tetapi jika pemutar melanjutkan setelah pengguna sudah mulai menonton video — ini menyebabkan iritasi. Bendera wasPlayingBeforeLoss melindungi dari kelanjutan palsu.
Pertanyaan Umum
Ya, mulai Android 12, Google Play merekomendasikan implementasi Audio Focus untuk semua aplikasi yang memutar audio. Aplikasi kategori Music & Audio wajib mengimplementasikannya untuk publikasi. Mengabaikannya dapat menyebabkan penolakan pembaruan.
Mulai pemutar, lalu buka aplikasi lain dengan audio (misalnya, YouTube Music). Pemutar Anda harus menjeda. Kemudian tutup YouTube Music — pemutar harus melanjutkan secara otomatis. Untuk tes duck, gunakan Google Maps dengan petunjuk suara.
Sistem memberi tahu: „Aplikasi lain perlu memutar suara pendek — redam pemutar Anda". Ini optimal untuk petunjuk suara dan notifikasi pendek. Volume dipulihkan setelah audio eksternal selesai tanpa campur tangan manual.
Secara formal ya — sistem tidak memaksa. Tetapi dalam praktiknya ini berarti tumpang tindih suara. Pengguna akan mendengar musik dan panggilan secara bersamaan, yang mengarah pada pengalaman negatif. Google merekomendasikan untuk selalu menangani AUDIOFOCUS_LOSS dengan menghentikan pemutar.
Di iOS, peran serupa dimainkan oleh Audio Session, yang dikelola melalui AVAudioSession. Mekanismenya mirip: kategori dan opsi menentukan perilaku saat tumpang tindih suara. Namun, API dan aturannya sangat berbeda — setiap framework diimplementasikan dengan caranya sendiri.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga