Audio Focus — механизам Android-а који регулише истовремену употребу аудио излаза од стране више апликација. Спречава преклапање звукова: када једна апликација започне репродукцију, систем аутоматски пригуши или заустави другу. Према Android Developer Guide, 2026, Audio Focus је обавезан за све апликације које репродукују аудио — без њега Google Play може одбити ажурирање.
Главно
Audio Focus — централизовани систем арбитраже звука у Android-у. Када једна апликација затражи фокус, систем провјерава да ли постоји активни «власник» фокуса и шаље му обавијест о губитку. Власник може или да пригуши звук (duck), или да заустави репродукцију, или да игнорише — у зависности од типа фокуса.
Прије Android 8.0 фокус се управљао путем AudioManager.requestAudioFocus(callback, stream, durationHint). Почевши од Android 8.0, појавио се AudioFocusRequest, који је додао могућност навођења типа захтјева и аутоматско враћање фокуса. У Android 12 механизам је појачан — сви медија плејери су обавезни да правилно обрађују фокус за објављивање у Google Play-у.
Према Google I/O 2024, око 15% жалби корисника у рецензијама аудио апликација односи се на преклапање звукова. Правилна имплементација Audio Focus рјешава овај проблем и побољшава корисничко искуство за 30% у погледу времена слушања.
Важно је разумјети да Audio Focus не управља репродукцијом аутоматски. Он само обавјештава апликацију о догађајима фокуса. Апликација сама одлучује: зауставити плејер, смањити јачину звука или наставити са репродукцијом. Систем не приморава — то је архитектонска одлука остављена на вољу програмера.
Изузетак су апликације за навигацију (Google Maps, Yandex.Maps). Оне могу затражити фокус типа AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, при којем се постојећи плејер пригушује, а гласовне упуте се чују изнад. Након завршетка упутства, плејер аутоматски враћа јачину звука.
Систем одржава једног активног власника аудио фокуса. При захтјеву за фокусом од стране нове апликације, систем одређује приоритет и шаље догађај тренутном власнику. Ако тренутни власник игнорише догађај и настави да пушта гласно, систем не примјењује санкције — одговорност је у потпуности на плејеру.
Захтјев за фокус укључује параметар durationHint, који обавјештава систем о претпостављеном трајању: AUDIOFOCUS_GAIN (дуготрајна репродукција — музика, подкаст), AUDIOFOCUS_GAIN_TRANSIENT (краткотрајна — звук обавијести, навигација), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (краткотрајна са дозволом за пригушивање постојећег плејера).
При губитку фокуса апликација добија један од три кода: AUDIOFOCUS_LOSS (дуготрајни губитак — друга апликација је покренула музику), AUDIOFOCUS_LOSS_TRANSIENT (привремени губитак — позив, обавијест), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (привремени губитак са могућношћу пригушења). Сваки код захтијева своју реакцију.
Корисник слуша музику у апликацији A. Стиже позив — апликација B (телефон) захтијева AUDIOFOCUS_GAIN_TRANSIENT. Систем шаље AUDIOFOCUS_LOSS_TRANSIENT апликацији A. Плејер се зауставља. Након завршетка позива, апликација B ослобађа фокус, систем обавјештава апликацију A путем AUDIOFOCUS_GAIN — плејер наставља репродукцију. Цијели ланац траје мање од 50 ms.
Правилан избор durationHint — кључна одлука при имплементацији Audio Focus. Грешка у избору типа води или до преклапања звукова, или до неоправданог заустављања плејера, или до иритације корисника.
| Тип захтјева | Сценарио | Реакција власника |
|---|---|---|
| AUDIOFOCUS_GAIN | Покретање музике, подкаста | AUDIOFOCUS_LOSS — плејер треба да се заустави |
| AUDIOFOCUS_GAIN_TRANSIENT | Позив, гласовно обавијештење | AUDIOFOCUS_LOSS_TRANSIENT — пауза |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | GPS упутство, кратки сигнал | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — пригушење |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Гласовна претрага, снимање | AUDIOFOCUS_LOSS — потпуно заустављање |
Duck — привремено смањење јачине звука главног плејера на 20–30% за вријеме трајања споредног звука. Android пружа API за ручно duck путем AudioManager.adjustSuggestedStreamVolume, али већина плејера имплементира пригушење властитим средствима. Према Android Documentation (2026), duck обрада треба да траје не више од 3 секунде, након чега се јачина звука враћа.
За правилну имплементацију Audio Focus потребно је узастопно извршити три корака: креирати захтјев, затражити фокус прије репродукције и обрадити догађај у callback-у. Коришћење AudioFocusRequestCompat из AndroidX media обезбјеђује компатибилност са свим верзијама 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()
}
Захтјев за фокус треба извршити прије почетка репродукције сваки пут када корисник притисне Play. Ако је резултат AUDIOFOCUS_REQUEST_GRANTED — започните репродукцију. Ако је DENIED — прикажите кориснику поруку или одложите репродукцију до добијања фокуса.
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()
}
}
}
У callback-у је важно разликовати AUDIOFOCUS_LOSS и AUDIOFOCUS_LOSS_TRANSIENT. У првом случају плејер НЕ треба да се настави аутоматски — корисник је експлицитно покренуо други аудио. У другом — може се аутоматски наставити по пријему AUDIOFOCUS_GAIN. Флаг wasPlayingBeforeLoss помаже да се запамти да ли треба вратити репродукцију.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
Позив abandonAudioFocusRequest обавјештава систем да апликацији више није потребан фокус. Важно га је позвати при паузи и заустављању плејера. Ако се фокус не ослободи, друга апликација која затражи AUDIOFOCUS_GAIN неће добити LOSS и звукови ће се преклапати.
Исправна обрада губитка фокуса — кључни захтјев за продазак рецензије у Google Play-у. Неправилна обрада води до негативних рецензија: корисници се жале да музика наставља да свира током позива или преко навигације.
По пријему AUDIOFOCUS_LOSS плејер треба да се заустави и не наставља до експлицитног притиска на Play. При AUDIOFOCUS_LOSS_TRANSIENT (позив, обавијест) плејер се зауставља и аутоматски наставља по враћању фокуса. При AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK плејер привремено смањује јачину звука на 20–30% за вријеме трајања спољног звука.
Према Android Developer Guide (2026), duck треба имплементирати множењем тренутног нивоа јачине звука AudioTrack-а коефицијентом 0,2–0,3. Немојте користити AudioManager.setStreamVolume — то мијења системску јачину звука и утиче на друге апликације. Duck се извршава само на страни свог плејера.
При долазном позиву систем аутоматски захтијева AUDIOFOCUS_GAIN_TRANSIENT путем апликације Телефон. Плејер добија AUDIOFOCUS_LOSS_TRANSIENT и зауставља се. Након завршетка позива или ако је корисник одбио позив, фокус се враћа — плејер аутоматски наставља репродукцију, ако је ријеч о музичком плејеру.
За навигационе апликације (Google Maps) користи се AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK при гласовним упутствима. Плејер се пригушује на 2–3 секунде, затим се јачина звука враћа. Ако корисник слуша подкаст, а не музику, умјесто duck боље је ставити на паузу — у подкастима је свака секунда важна.
У пракси програмери се сусрећу са неколико стандардних сценарија у којима се Audio Focus понаша различито. Размотримо типичне случајеве и правилне реакције на њих.
Важно је имплементирати флаг који памти да ли је музика свирала прије губитка фокуса. Ако је корисник сам притиснуо паузу, а затим је стигао позив — не треба настављати. Флаг се ресетује при експлицитној паузи корисника и поставља при старту репродукције.
Према UX истраживањима Google-а (2024), аутоматско настављање након позива повећава задовољство корисника за 22%. Али ако се плејер настави након што је корисник већ почео да гледа видео — то изазива иритацију. Флаг wasPlayingBeforeLoss штити од лажних наставака.
Често постављана питања
Да, почевши од Android 12, Google Play препоручује имплементацију Audio Focus за све апликације које репродукују аудио. Апликације категорије Music & Audio су обавезне да га имплементирају за објављивање. Игнорисање може довести до одбијања ажурирања.
Покрените плејер, затим отворите другу апликацију са аудиом (нпр. YouTube Music). Ваш плејер би требало да се заустави. Затим затворите YouTube Music — плејер би требало да се аутоматски настави. За duck тест користите Google Maps са гласовним упутствима.
Систем поручује: «Другој апликацији треба кратко да репродукује звук — пригуши свој плејер». Ово је оптимално за гласовна упутства и кратке обавијести. Јачина звука се враћа након завршетка туђег звука без ручне интервенције.
Формално да — систем не приморава. Али у пракси то значи преклапање звукова. Корисник ће истовремено чути музику и позив, што води до негативног искуства. Google препоручује да увијек обрађујете AUDIOFOCUS_LOSS заустављањем плејера.
На iOS-у аналогну улогу има Audio Session, којом се управља путем AVAudioSession. Механизми су слични: категорије и опције одређују понашање при преклапању звукова. Међутим, API и правила се битно разликују — сваки framework је имплементиран на свој начин.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође