Audio Focus: podstata pojmu, režimy a správa v Androidu

Autor: IT Sectr Publikováno: 2026-05-23 Doba čtení: 8 min

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 — systémový mechanismus Androidu pro koordinaci audio přehrávání mezi aplikacemi bez překrývání zvuků.
  • Požadavek na fokus se provádí prostřednictvím AudioManager.requestAudioFocus() s uvedením typu a doby trvání přehrávání.
  • Systém oznamuje změnu fokusu prostřednictvím AudioManager.OnAudioFocusChangeListener s kódy AUDIOFOCUS_GAIN, LOSS a DUCK.
  • Auto Resume — při obdržení AUDIOFOCUS_LOSS by aplikace měla pozastavit přehrávání a obnovit při AUDIOFOCUS_GAIN.
  • Android 12+ vyžaduje povinné použití AudioFocusRequestCompat z AndroidX pro vytvoření požadavku na fokus.

Co je Audio Focus?

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.

Audio Focus a přehrávání médií

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.

Jak funguje Audio Focus v Androidu

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.

Řetězec událostí Audio Focus

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.

Typy a režimy požadavku Audio Focus

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žadavkuScénářReakce vlastníka
AUDIOFOCUS_GAINSpuštění hudby, podcastuAUDIOFOCUS_LOSS — přehrávač by se měl zastavit
AUDIOFOCUS_GAIN_TRANSIENTHovor, hlasové oznámeníAUDIOFOCUS_LOSS_TRANSIENT — pauza
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKGPS pokyn, krátký signálAUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — ztlumení
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVEHlasové vyhledávání, nahráváníAUDIOFOCUS_LOSS — úplné zastavení

Vlastnosti AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK

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.

Implementace Audio Focus v kódu

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.

Vytvoření a provedení požadavku 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()
}

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.

Callback zpracování změny fokusu

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()
        }
    }
}

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í.

Uvolnění Audio Focus

kotlin
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.

Zpracování ztráty audiofokusu

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.

Zpracování hovorů a navigace

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ě.

Typické scénáře použití

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ě.

  • Hudba + hovor — přehrávač se pozastaví (AUDIOFOCUS_LOSS_TRANSIENT). Po hovoru automaticky obnoví, pokud uživatel neprovedl akce v přehrávači.
  • Hudba + navigace — přehrávač je ztlumen po dobu hlasového pokynu (DUCK). Hlasitost je obnovena po dokončení fráze.
  • Uživatel spustil jinou aplikaci — přehrávač obdrží AUDIOFOCUS_LOSS a zastaví se. Obnovení pouze tlačítkem Play.
  • Video + hudba na pozadí — video přehrávač požádá o AUDIOFOCUS_GAIN. Hudební přehrávač obdrží LOSS a zastaví se.
  • Hlasové vyhledávání (Google Assistant) — aplikace obdrží AUDIOFOCUS_LOSS_TRANSIENT, pozastaví se a automaticky obnoví po odpovědi asistenta.

Automatické obnovení po ztrátě fokusu

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

Je Audio Focus povinný pro všechny aplikace s audiem?

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.

Jak zkontrolovat, že Audio Focus funguje správně?

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.

Co je AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK v praxi?

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.

Lze odmítnout požadavek na ztrátu Audio Focus?

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.

Funguje Audio Focus na jiných platformách než Android?

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í

  • Audio Focus — systémový arbitr audia v Androidu, který zabraňuje překrývání zvuků z různých aplikací.
  • Požadavek na fokus se provádí prostřednictvím AudioFocusRequestCompat s uvedením durationHint: GAIN, TRANSIENT nebo TRANSIENT_MAY_DUCK.
  • Callback OnAudioFocusChangeListener zpracovává čtyři události: GAIN, LOSS, LOSS_TRANSIENT a LOSS_TRANSIENT_CAN_DUCK.
  • Při AUDIOFOCUS_LOSS se přehrávač zastaví, při TRANSIENT — pozastaví s automatickým obnovením, při DUCK — ztlumí.
  • Je důležité si pamatovat příznak wasPlayingBeforeLoss, aby nedošlo k obnovení přehrávání po explicitní pauze uživatele.
  • Uvolnění fokusu prostřednictvím abandonAudioFocusRequest je povinné při pauze a zastavení přehrávače.
  • Na iOS je ekvivalentem Audio Focus Audio Session (AVAudioSession) s vlastními kategoriemi a režimy.

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í.

Prodiskutovat projekt

Přečtěte si také