Audio Focus — mekanismo ng Android na kumokontrol sa sabay-sabay na paggamit ng audio output ng maraming application. Pinipigilan nito ang pag-overlap ng mga tunog: kapag ang isang application ay nagsimulang mag-play, awtomatikong pinapahina o pinipigilan ng system ang isa pa. Ayon sa Android Developer Guide, 2026, Audio Focus ay sapilitan para sa lahat ng application na nagpe-play ng audio — kung wala ito, maaaring tanggihan ng Google Play ang update.
Mga Pangunahing Punto
Audio Focus — ay isang sentralisadong sistema ng arbitrasyon ng audio sa Android. Kapag ang isang application ay humiling ng focus, sinusuri ng system kung mayroong aktibong „may-ari" ng focus at nagpapadala sa kanya ng abiso ng pagkawala. Ang may-ari ay maaaring magpahina ng tunog (duck), mag-pause ng playback, o magpabaya — depende sa uri ng focus.
Bago ang Android 8.0, ang focus ay pinamamahalaan sa pamamagitan ng AudioManager.requestAudioFocus(callback, stream, durationHint). Simula sa Android 8.0, lumitaw ang AudioFocusRequest, na nagdagdag ng kakayahang tukuyin ang uri ng hiling at awtomatikong pagpapanumbalik ng focus. Sa Android 12, pinalakas ang mekanismo — lahat ng media player ay dapat na wastong pangasiwaan ang focus para sa publikasyon sa Google Play.
Ayon sa Google I/O 2024, humigit-kumulang 15% ng mga reklamo ng user sa mga review ng audio application ay nauugnay sa pag-overlap ng tunog. Ang wastong pagpapatupad ng Audio Focus ay lumulutas sa problemang ito at nagpapabuti sa karanasan ng user ng 30% sa oras ng pakikinig.
Mahalagang maunawaan na ang Audio Focus ay hindi awtomatikong namamahala ng playback. Ito ay nag-aabiso lamang sa application tungkol sa mga kaganapan ng focus. Ang application mismo ang nagdedesisyon: i-pause ang player, babaan ang volume, o magpatuloy sa pag-play. Hindi pinipilit ng system — ito ay isang desisyong arkitektural na iniwan sa pagpapasya ng developer.
Ang eksepsyon ay mga application ng nabigasyon (Google Maps, Yandex.Maps). Maaari silang humiling ng focus ng uri na AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, kung saan ang umiiral na player ay pinapahina at ang mga tagubilin sa boses ay tumutugtog sa ibabaw nito. Pagkatapos ng tagubilin, awtomatikong ibinabalik ng player ang volume.
Ang system ay nagpapanatili ng isang aktibong may-ari ng audio focus. Kapag humiling ng focus ang isang bagong application, tinutukoy ng system ang priyoridad at nagpapadala ng kaganapan sa kasalukuyang may-ari. Kung hindi pinansin ng kasalukuyang may-ari ang kaganapan at patuloy na nagpapatugtog nang malakas, hindi naglalapat ng parusa ang system — ang responsibilidad ay ganap na nasa player.
Ang hiling ng focus ay may kasamang parameter na durationHint, na nag-aabiso sa system tungkol sa inaasahang tagal: AUDIOFOCUS_GAIN (mahabang playback — musika, podcast), AUDIOFOCUS_GAIN_TRANSIENT (maikli — tunog ng notipikasyon, nabigasyon), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (maikli na may pahintulot na pahinain ang umiiral na player).
Sa pagkawala ng focus, ang application ay tumatanggap ng isa sa tatlong code: AUDIOFOCUS_LOSS (pangmatagalang pagkawala — ibang application ay nag-start ng musika), AUDIOFOCUS_LOSS_TRANSIENT (pansamantalang pagkawala — tawag, notipikasyon), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (pansamantalang pagkawala na may posibilidad ng pagpapahina). Bawat code ay nangangailangan ng sariling reaksyon.
Ang user ay nakikinig ng musika sa application A. May papasok na tawag — ang application B (telepono) ay humihiling ng AUDIOFOCUS_GAIN_TRANSIENT. Ang system ay nagpapadala ng AUDIOFOCUS_LOSS_TRANSIENT sa application A. Ang player ay nagpa-pause. Pagkatapos ng tawag, ang application B ay naglalabas ng focus, ang system ay nag-aabiso sa application A sa pamamagitan ng AUDIOFOCUS_GAIN — ang player ay nagpapatuloy ng playback. Ang buong kadena ay tumatagal ng mas mababa sa 50 ms.
Ang tamang pagpili ng durationHint — ang pangunahing desisyon sa pagpapatupad ng Audio Focus. Ang pagkakamali sa pagpili ng uri ay humahantong sa pag-overlap ng tunog, hindi makatarungang paghinto ng player, o pagkairita ng user.
| Uri ng hiling | Senaryo | Reaksyon ng may-ari |
|---|---|---|
| AUDIOFOCUS_GAIN | Pagsisimula ng musika, podcast | AUDIOFOCUS_LOSS — player ay dapat huminto |
| AUDIOFOCUS_GAIN_TRANSIENT | Tawag, notipikasyon sa boses | AUDIOFOCUS_LOSS_TRANSIENT — pause |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | Tagubilin ng GPS, maikling signal | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — pagpapahina |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Paghahanap sa boses, pagre-record | AUDIOFOCUS_LOSS — ganap na paghinto |
Duck — pansamantalang pagbaba ng volume ng pangunahing player sa 20–30% habang tumutugtog ang pangalawang tunog. Ang Android ay nagbibigay ng API para sa manu-manong duck sa pamamagitan ng AudioManager.adjustSuggestedStreamVolume, ngunit karamihan ng player ay nagpapatupad ng pagpapahina sa pamamagitan ng kanilang sariling paraan. Ayon sa Android Documentation (2026), ang pagproseso ng duck ay hindi dapat tumagal ng higit sa 3 segundo, pagkatapos nito ay ibinabalik ang volume.
Para sa wastong pagpapatupad ng Audio Focus, kinakailangang sunod-sunod na gawin ang tatlong hakbang: gumawa ng hiling, humiling ng focus bago mag-play, at pangasiwaan ang kaganapan sa callback. Ang paggamit ng AudioFocusRequestCompat mula sa AndroidX media ay tinitiyak ang compatibility sa lahat ng bersyon ng 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()
}
Ang hiling ng focus ay dapat gawin bago magsimula ng playback sa bawat oras na pinindot ng user ang Play. Kung ang resulta ay AUDIOFOCUS_REQUEST_GRANTED — simulan ang pag-play. Kung DENIED — magpakita ng mensahe sa user o ipagpaliban ang playback hanggang makuha ang focus.
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()
}
}
}
Sa callback, mahalagang makilala ang AUDIOFOCUS_LOSS at AUDIOFOCUS_LOSS_TRANSIENT. Sa unang kaso, ang player ay HINDI dapat magpatuloy nang awtomatiko — ang user ay nag-start ng ibang audio nang tahasan. Sa pangalawa — maaaring magpatuloy nang awtomatiko kapag nakatanggap ng AUDIOFOCUS_GAIN. Ang flag na wasPlayingBeforeLoss ay tumutulong na matandaan kung kailangang ibalik ang playback.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
Ang pagtawag sa abandonAudioFocusRequest ay nag-aabiso sa system na ang application ay hindi na nangangailangan ng focus. Mahalagang tawagin ito sa pause at paghinto ng player. Kung hindi ilalabas ang focus, ang ibang application na humihiling ng AUDIOFOCUS_GAIN ay hindi makakatanggap ng LOSS at ang mga tunog ay mag-o-overlap.
Ang wastong pangangasiwa ng pagkawala ng focus — ang pangunahing kinakailangan para makapasa sa pagsusuri sa Google Play. Ang hindi wastong pangangasiwa ay humahantong sa negatibong mga review: nagrereklamo ang mga user na patuloy na tumutugtog ang musika habang may tawag o sa ibabaw ng nabigasyon.
Kapag nakatanggap ng AUDIOFOCUS_LOSS, dapat huminto ang player at hindi magpatuloy hanggang sa tahasang pagpindot ng Play. Sa AUDIOFOCUS_LOSS_TRANSIENT (tawag, notipikasyon), ang player ay nagpa-pause at awtomatikong nagpapatuloy kapag naibalik ang focus. Sa AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK, ang player ay pansamantalang nagpapababa ng volume sa 20–30% habang tumutugtog ang panlabas na audio.
Ayon sa Android Developer Guide (2026), ang duck ay dapat ipatupad sa pamamagitan ng pag-multiply ng kasalukuyang antas ng volume ng AudioTrack sa factor na 0.2–0.3. Huwag gumamit ng AudioManager.setStreamVolume — binabago nito ang system volume at nakakaapekto sa ibang application. Ang duck ay ginagawa lamang sa bahagi ng sariling player.
Sa papasok na tawag, awtomatikong humihiling ang system ng AUDIOFOCUS_GAIN_TRANSIENT sa pamamagitan ng application ng Telepono. Ang player ay tumatanggap ng AUDIOFOCUS_LOSS_TRANSIENT at nagpa-pause. Pagkatapos ng tawag o kung tinanggihan ng user ang tawag, bumalik ang focus — awtomatikong nagpapatuloy ang player ng playback, kung ito ay isang music player.
Para sa mga application ng nabigasyon (Google Maps), ginagamit ang AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK sa mga tagubilin sa boses. Ang player ay pinapahina ng 2–3 segundo, pagkatapos ay ibinabalik ang volume. Kung ang user ay nakikinig ng podcast, hindi musika, mas mabuting mag-pause kaysa mag-duck — sa mga podcast, bawat segundo ay mahalaga.
Sa praktika, ang mga developer ay nakakaharap ng ilang karaniwang senaryo kung saan ang Audio Focus ay kumikilos nang iba. Tingnan natin ang mga tipikal na kaso at tamang reaksyon sa mga ito.
Mahalagang magpatupad ng flag na nakakaalala kung ang musika ay tumutugtog bago ang pagkawala ng focus. Kung ang user mismo ay nag-pause at pagkatapos ay may pumasok na tawag — hindi kailangang magpatuloy. Ang flag ay nire-reset sa tahasang pause ng user at itinatakda sa pagsisimula ng playback.
Ayon sa pananaliksik ng UX ng Google (2024), ang awtomatikong pagpapatuloy pagkatapos ng tawag ay nagpapataas ng kasiyahan ng user ng 22%. Ngunit kung ang player ay nagpatuloy pagkatapos na magsimulang manood ng video ang user — ito ay nagdudulot ng pagkairita. Ang flag na wasPlayingBeforeLoss ay nagpoprotekta laban sa maling pagpapatuloy.
Mga Madalas Itanong
Oo, simula sa Android 12, inirerekomenda ng Google Play ang pagpapatupad ng Audio Focus para sa lahat ng application na nagpe-play ng audio. Ang mga application sa kategoryang Music & Audio ay kinakailangang ipatupad ito para sa publikasyon. Ang pagpapabaya ay maaaring humantong sa pagtanggi ng update.
Simulan ang player, pagkatapos ay buksan ang ibang application na may audio (halimbawa, YouTube Music). Ang iyong player ay dapat mag-pause. Pagkatapos ay isara ang YouTube Music — ang player ay dapat awtomatikong magpatuloy. Para sa duck test, gamitin ang Google Maps na may mga tagubilin sa boses.
Ang system ay nag-aabiso: „Kailangang magpatugtog ng maikling tunog ang ibang application — pahinain ang iyong player". Ito ay optimal para sa mga tagubilin sa boses at maikling notipikasyon. Ang volume ay ibinabalik pagkatapos ng panlabas na audio nang walang manu-manong interbensyon.
Sa pormal, oo — hindi pinipilit ng system. Ngunit sa praktika, ito ay nangangahulugan ng pag-overlap ng tunog. Maririnig ng user ang musika at tawag nang sabay, na humahantong sa negatibong karanasan. Inirerekomenda ng Google na palaging pangasiwaan ang AUDIOFOCUS_LOSS sa pamamagitan ng paghinto ng player.
Sa iOS, ang katulad na papel ay ginagampanan ng Audio Session, na pinamamahalaan sa pamamagitan ng AVAudioSession. Ang mga mekanismo ay magkatulad: ang mga kategorya at opsyon ay tumutukoy sa pag-uugali sa pag-overlap ng tunog. Gayunpaman, ang API at mga patakaran ay lubhang naiiba — bawat framework ay ipinatupad sa sarili nitong paraan.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din