Audio Focus: суштина појма, режими и управљање у Android-у

Аутор: IT Sectr Објављено: 2026-05-23 Време читања: 8 мин

Audio Focus — механизам Android-а који регулише истовремену употребу аудио излаза од стране више апликација. Спречава преклапање звукова: када једна апликација започне репродукцију, систем аутоматски пригуши или заустави другу. Према Android Developer Guide, 2026, Audio Focus је обавезан за све апликације које репродукују аудио — без њега Google Play може одбити ажурирање.

Главно

  • Audio Focus — системски механизам Android-а за координацију аудио репродукције између апликација без преклапања звукова.
  • Захтјев за фокусом се извршава путем AudioManager.requestAudioFocus() са навођењем типа и трајања репродукције.
  • Систем обавјештава о промјени фокуса путем AudioManager.OnAudioFocusChangeListener са кодовима AUDIOFOCUS_GAIN, LOSS и DUCK.
  • Auto Resume — приликом пријема AUDIOFOCUS_LOSS апликација треба да заустави репродукцију и настави при AUDIOFOCUS_GAIN.
  • Android 12+ захтијева обавезно коришћење AudioFocusRequestCompat из AndroidX-а за креирање захтјева за фокусом.

Шта је Audio Focus?

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 и репродукција медија

Важно је разумјети да Audio Focus не управља репродукцијом аутоматски. Он само обавјештава апликацију о догађајима фокуса. Апликација сама одлучује: зауставити плејер, смањити јачину звука или наставити са репродукцијом. Систем не приморава — то је архитектонска одлука остављена на вољу програмера.

Изузетак су апликације за навигацију (Google Maps, Yandex.Maps). Оне могу затражити фокус типа AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, при којем се постојећи плејер пригушује, а гласовне упуте се чују изнад. Након завршетка упутства, плејер аутоматски враћа јачину звука.

Како функционише Audio Focus у Android-у

Систем одржава једног активног власника аудио фокуса. При захтјеву за фокусом од стране нове апликације, систем одређује приоритет и шаље догађај тренутном власнику. Ако тренутни власник игнорише догађај и настави да пушта гласно, систем не примјењује санкције — одговорност је у потпуности на плејеру.

Захтјев за фокус укључује параметар durationHint, који обавјештава систем о претпостављеном трајању: AUDIOFOCUS_GAIN (дуготрајна репродукција — музика, подкаст), AUDIOFOCUS_GAIN_TRANSIENT (краткотрајна — звук обавијести, навигација), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (краткотрајна са дозволом за пригушивање постојећег плејера).

При губитку фокуса апликација добија један од три кода: AUDIOFOCUS_LOSS (дуготрајни губитак — друга апликација је покренула музику), AUDIOFOCUS_LOSS_TRANSIENT (привремени губитак — позив, обавијест), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (привремени губитак са могућношћу пригушења). Сваки код захтијева своју реакцију.

Ланац догађаја Audio Focus

Корисник слуша музику у апликацији A. Стиже позив — апликација B (телефон) захтијева AUDIOFOCUS_GAIN_TRANSIENT. Систем шаље AUDIOFOCUS_LOSS_TRANSIENT апликацији A. Плејер се зауставља. Након завршетка позива, апликација B ослобађа фокус, систем обавјештава апликацију A путем AUDIOFOCUS_GAIN — плејер наставља репродукцију. Цијели ланац траје мање од 50 ms.

Врсте и режими захтјева Audio Focus

Правилан избор durationHint — кључна одлука при имплементацији Audio Focus. Грешка у избору типа води или до преклапања звукова, или до неоправданог заустављања плејера, или до иритације корисника.

Тип захтјеваСценариоРеакција власника
AUDIOFOCUS_GAINПокретање музике, подкастаAUDIOFOCUS_LOSS — плејер треба да се заустави
AUDIOFOCUS_GAIN_TRANSIENTПозив, гласовно обавијештењеAUDIOFOCUS_LOSS_TRANSIENT — пауза
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKGPS упутство, кратки сигналAUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — пригушење
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVEГласовна претрага, снимањеAUDIOFOCUS_LOSS — потпуно заустављање

Карактеристике AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK

Duck — привремено смањење јачине звука главног плејера на 20–30% за вријеме трајања споредног звука. Android пружа API за ручно duck путем AudioManager.adjustSuggestedStreamVolume, али већина плејера имплементира пригушење властитим средствима. Према Android Documentation (2026), duck обрада треба да траје не више од 3 секунде, након чега се јачина звука враћа.

Имплементација Audio Focus у коду

За правилну имплементацију Audio Focus потребно је узастопно извршити три корака: креирати захтјев, затражити фокус прије репродукције и обрадити догађај у callback-у. Коришћење AudioFocusRequestCompat из AndroidX media обезбјеђује компатибилност са свим верзијама Android-а.

Креирање и извршење захтјева Audio Focus

kotlin
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 — прикажите кориснику поруку или одложите репродукцију до добијања фокуса.

Callback обраде промјене фокуса

kotlin
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 помаже да се запамти да ли треба вратити репродукцију.

Ослобађање Audio Focus

kotlin
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 понаша различито. Размотримо типичне случајеве и правилне реакције на њих.

  • Музика + позив — плејер се зауставља (AUDIOFOCUS_LOSS_TRANSIENT). Након позива аутоматски наставља, ако корисник није вршио радње у плејеру.
  • Музика + навигација — плејер се пригушује за вријеме гласовног упутства (DUCK). Јачина звука се враћа након завршетка фразе.
  • Корисник је покренуо другу апликацију — плејер добија AUDIOFOCUS_LOSS и зауставља се. Наставак само притиском на Play.
  • Видео + музика у позадини — видео плејер захтијева AUDIOFOCUS_GAIN. Музички плејер добија LOSS и зауставља се.
  • Гласовна претрага (Google Assistant) — апликација добија AUDIOFOCUS_LOSS_TRANSIENT, зауставља се и аутоматски наставља након одговора асистента.

Аутоматско настављање након губитка фокуса

Важно је имплементирати флаг који памти да ли је музика свирала прије губитка фокуса. Ако је корисник сам притиснуо паузу, а затим је стигао позив — не треба настављати. Флаг се ресетује при експлицитној паузи корисника и поставља при старту репродукције.

Према UX истраживањима Google-а (2024), аутоматско настављање након позива повећава задовољство корисника за 22%. Али ако се плејер настави након што је корисник већ почео да гледа видео — то изазива иритацију. Флаг wasPlayingBeforeLoss штити од лажних наставака.

Често постављана питања

Да ли је Audio Focus обавезан за све апликације са аудиом?

Да, почевши од Android 12, Google Play препоручује имплементацију Audio Focus за све апликације које репродукују аудио. Апликације категорије Music & Audio су обавезне да га имплементирају за објављивање. Игнорисање може довести до одбијања ажурирања.

Како провјерити да Audio Focus ради исправно?

Покрените плејер, затим отворите другу апликацију са аудиом (нпр. YouTube Music). Ваш плејер би требало да се заустави. Затим затворите YouTube Music — плејер би требало да се аутоматски настави. За duck тест користите Google Maps са гласовним упутствима.

Шта је AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK у пракси?

Систем поручује: «Другој апликацији треба кратко да репродукује звук — пригуши свој плејер». Ово је оптимално за гласовна упутства и кратке обавијести. Јачина звука се враћа након завршетка туђег звука без ручне интервенције.

Може ли се одбити захтјев за губитак Audio Focus?

Формално да — систем не приморава. Али у пракси то значи преклапање звукова. Корисник ће истовремено чути музику и позив, што води до негативног искуства. Google препоручује да увијек обрађујете AUDIOFOCUS_LOSS заустављањем плејера.

Да ли Audio Focus ради на другим платформама осим Android-а?

На iOS-у аналогну улогу има Audio Session, којом се управља путем AVAudioSession. Механизми су слични: категорије и опције одређују понашање при преклапању звукова. Међутим, API и правила се битно разликују — сваки framework је имплементиран на свој начин.

Закључци

  • Audio Focus — системски арбитар звука у Android-у, који спречава преклапање звукова из различитих апликација.
  • Захтјев за фокусом се извршава путем AudioFocusRequestCompat са навођењем durationHint: GAIN, TRANSIENT или TRANSIENT_MAY_DUCK.
  • Callback OnAudioFocusChangeListener обрађује четири догађаја: GAIN, LOSS, LOSS_TRANSIENT и LOSS_TRANSIENT_CAN_DUCK.
  • При AUDIOFOCUS_LOSS плејер се зауставља, при TRANSIENT — зауставља се са ауто-наставком, при DUCK — пригушује се.
  • Важно је запамтити флаг wasPlayingBeforeLoss да се не би наставила репродукција након експлицитне паузе корисника.
  • Ослобађање фокуса путем abandonAudioFocusRequest је обавезно при паузи и заустављању плејера.
  • На iOS-у аналог Audio Focus-а је Audio Session (AVAudioSession) са властитим категоријама и режимима.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође