Audio Focus — mechanismus Androidu, který reguluje současné používání audio výstupu několika aplikacemi. Zabraňuje překrývání zvuků: když jedna aplikace začne přehrávat, systém automaticky ztlumí nebo pozastaví druhou. Podle Android Developer Guide, 2026 je Audio Focus povinný pro všechny aplikace přehrávající audio — bez něj může Google Play zamítnout aktualizaci.
Hlavní body
Audio Focus — centralizovaný systém arbitráže zvuku v Androidu. Když jedna aplikace požádá o fokus, systém zkontroluje, zda existuje aktivní „vlastník" fokusu, a pošle mu oznámení o ztrátě. Vlastník může zvuk ztlumit (duck), pozastavit přehrávání nebo ignorovat — v závislosti na typu fokusu.
Před Androidem 8.0 byl fokus spravován prostřednictvím AudioManager.requestAudioFocus(callback, stream, durationHint). Od Androidu 8.0 se objevil AudioFocusRequest, který přidal možnost specifikovat typ požadavku a automatické obnovení fokusu. V Androidu 12 byl mechanismus posílen — všechny multimediální přehrávače musí správně zpracovávat fokus pro publikaci v Google Play.
Podle Google I/O 2024 přibližně 15% stížností uživatelů v recenzích audio aplikací souvisí s překrýváním zvuků. Správná implementace Audio Focus řeší tento problém a zlepšuje uživatelský zážitek o 30% z hlediska doby poslechu.
Je důležité pochopit, že Audio Focus nespravuje přehrávání automaticky. Pouze oznamuje aplikaci události fokusu. Aplikace sama rozhoduje: pozastavit přehrávač, snížit hlasitost nebo pokračovat v přehrávání. Systém nenutí — to je architektonické rozhodnutí ponechané na uvážení vývojáře.
Výjimkou jsou navigační aplikace (Google Maps, Yandex.Maps). Mohou požádat o fokus typu AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, při kterém je stávající přehrávač ztlumen a hlasové pokyny znějí nad ním. Po dokončení pokynu přehrávač automaticky obnoví hlasitost.
Systém udržuje jednoho aktivního vlastníka audio fokusu. Při požadavku na fokus novou aplikací systém určí prioritu a pošle událost aktuálnímu vlastníkovi. Pokud aktuální vlastník událost ignoruje a pokračuje v hlasitém přehrávání, systém neuplatňuje sankce — odpovědnost je plně na přehrávači.
Požadavek na fokus zahrnuje parametr durationHint, který informuje systém o předpokládané délce: AUDIOFOCUS_GAIN (dlouhé přehrávání — hudba, podcast), AUDIOFOCUS_GAIN_TRANSIENT (krátké — zvuk oznámení, navigace), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (krátké s povolením ztlumit stávající přehrávač).
Při ztrátě fokusu aplikace obdrží jeden ze tří kódů: AUDIOFOCUS_LOSS (dlouhodobá ztráta — jiná aplikace spustila hudbu), AUDIOFOCUS_LOSS_TRANSIENT (dočasná ztráta — hovor, oznámení), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (dočasná ztráta s možností ztlumení). Každý kód vyžaduje svou vlastní reakci.
Uživatel poslouchá hudbu v aplikaci A. Přichází hovor — aplikace B (telefon) požádá o AUDIOFOCUS_GAIN_TRANSIENT. Systém pošle AUDIOFOCUS_LOSS_TRANSIENT aplikaci A. Přehrávač se pozastaví. Po ukončení hovoru aplikace B uvolní fokus, systém informuje aplikaci A prostřednictvím AUDIOFOCUS_GAIN — přehrávač obnoví přehrávání. Celý řetězec trvá méně než 50 ms.
Správná volba durationHint — klíčové rozhodnutí při implementaci Audio Focus. Chyba ve výběru typu vede buď k překrývání zvuků, nebo k neodůvodněnému zastavení přehrávače, nebo k podráždění uživatele.
| Typ požadavku | Scénář | Reakce vlastníka |
|---|---|---|
| AUDIOFOCUS_GAIN | Spuštění hudby, podcastu | AUDIOFOCUS_LOSS — přehrávač by se měl zastavit |
| AUDIOFOCUS_GAIN_TRANSIENT | Hovor, hlasové oznámení | AUDIOFOCUS_LOSS_TRANSIENT — pauza |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | GPS pokyn, krátký signál | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — ztlumení |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Hlasové vyhledávání, nahrávání | AUDIOFOCUS_LOSS — úplné zastavení |
Duck — dočasné snížení hlasitosti hlavního přehrávače na 20–30% po dobu trvání vedlejšího zvuku. Android poskytuje API pro ruční duck prostřednictvím AudioManager.adjustSuggestedStreamVolume, ale většina přehrávačů implementuje ztlumení vlastními prostředky. Podle Android Documentation (2026) by zpracování duck nemělo trvat déle než 3 sekundy, poté je hlasitost obnovena.
Pro správnou implementaci Audio Focus je třeba postupně provést tři kroky: vytvořit požadavek, požádat o fokus před přehráváním a zpracovat událost v callbacku. Použití AudioFocusRequestCompat z AndroidX media zajišťuje kompatibilitu se všemi verzemi Androidu.
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()
}
Požadavek na fokus by měl být proveden před zahájením přehrávání pokaždé, když uživatel stiskne Play. Pokud je výsledek AUDIOFOCUS_REQUEST_GRANTED — spusťte přehrávání. Pokud DENIED — zobrazte uživateli zprávu nebo odložte přehrávání, dokud nezískáte fokus.
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()
}
}
}
V callbacku je důležité rozlišovat AUDIOFOCUS_LOSS a AUDIOFOCUS_LOSS_TRANSIENT. V prvním případě by přehrávač NEMěl automaticky obnovovat — uživatel explicitně spustil jiné audio. Ve druhém — lze automaticky obnovit při obdržení AUDIOFOCUS_GAIN. Příznak wasPlayingBeforeLoss pomáhá zapamatovat si, zda je třeba obnovit přehrávání.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
Volání abandonAudioFocusRequest informuje systém, že aplikace již nepotřebuje fokus. Je důležité jej volat při pauze a zastavení přehrávače. Pokud fokus neuvolníte, jiná aplikace požadující AUDIOFOCUS_GAIN neobdrží LOSS a zvuky se budou překrývat.
Správné zpracování ztráty fokusu — klíčový požadavek pro absolvování recenze v Google Play. Nesprávné zpracování vede k negativním recenzím: uživatelé si stěžují, že hudba pokračuje během hovoru nebo přes navigaci.
Při obdržení AUDIOFOCUS_LOSS by se měl přehrávač zastavit a neobnovovat do explicitního stisknutí Play. Při AUDIOFOCUS_LOSS_TRANSIENT (hovor, oznámení) se přehrávač pozastaví a automaticky obnoví při obnovení fokusu. Při AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK přehrávač dočasně sníží hlasitost na 20–30% po dobu externího audia.
Podle Android Developer Guide (2026) by měl být duck implementován vynásobením aktuální úrovně hlasitosti AudioTrack koeficientem 0,2–0,3. Nepoužívejte AudioManager.setStreamVolume — to mění systémovou hlasitost a ovlivňuje jiné aplikace. Duck se provádí pouze na straně vlastního přehrávače.
Při příchozím hovoru systém automaticky požádá o AUDIOFOCUS_GAIN_TRANSIENT prostřednictvím aplikace Telefon. Přehrávač obdrží AUDIOFOCUS_LOSS_TRANSIENT a pozastaví se. Po ukončení hovoru nebo pokud uživatel hovor odmítl, fokus se vrátí — přehrávač automaticky obnoví přehrávání, pokud se jedná o hudební přehrávač.
Pro navigační aplikace (Google Maps) se používá AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK při hlasových pokynech. Přehrávač je ztlumen na 2–3 sekundy, poté je hlasitost obnovena. Pokud uživatel poslouchá podcast místo hudby, je místo duck lepší pozastavit — v podcastech záleží na každé sekundě.
V praxi se vývojáři setkávají s několika standardními scénáři, ve kterých se Audio Focus chová různě. Podívejme se na typické případy a správné reakce na ně.
Je důležité implementovat příznak, který si pamatuje, zda hudba hrála před ztrátou fokusu. Pokud uživatel sám stiskl pauzu a poté přišel hovor — není třeba obnovovat. Příznak se resetuje při explicitní pauze uživatele a nastavuje se při spuštění přehrávání.
Podle UX výzkumu Google (2024) zvyšuje automatické obnovení po hovoru spokojenost uživatelů o 22%. Pokud se ale přehrávač obnoví poté, co uživatel již začal sledovat video — způsobuje to podráždění. Příznak wasPlayingBeforeLoss chrání před falešnými obnoveními.
Často kladené dotazy
Ano, počínaje Androidem 12 Google Play doporučuje implementaci Audio Focus pro všechny aplikace přehrávající audio. Aplikace kategorie Music & Audio jsou povinny jej implementovat pro publikaci. Ignorování může vést k zamítnutí aktualizace.
Spusťte přehrávač, poté otevřete jinou aplikaci s audiem (například YouTube Music). Váš přehrávač by se měl pozastavit. Poté zavřete YouTube Music — přehrávač by se měl automaticky obnovit. Pro duck test použijte Mapy Google s hlasovými pokyny.
Systém oznamuje: „Jiná aplikace potřebuje krátce přehrát zvuk — ztlum svůj přehrávač". To je optimální pro hlasové pokyny a krátká oznámení. Hlasitost je obnovena po skončení externího audia bez ručního zásahu.
Formálně ano — systém nenutí. Ale v praxi to znamená překrývání zvuků. Uživatel uslyší současně hudbu a hovor, což vede k negativnímu zážitku. Google doporučuje vždy zpracovávat AUDIOFOCUS_LOSS zastavením přehrávače.
Na iOS hraje analogickou roli Audio Session, spravovaná prostřednictvím AVAudioSession. Mechanizmy jsou podobné: kategorie a možnosti určují chování při překrývání zvuků. API a pravidla se však zásadně liší — každý framework je implementován jinak.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také