Audio Focus — Android-mechanizmus, amely szabályozza a hangkimenet egyidejű használatát több alkalmazás által. Megakadályozza a hangok átfedését: amikor egy alkalmazás elkezdi a lejátszást, a rendszer automatikusan elhalkítja vagy szünetelteti a másikat. A Android Developer Guide, 2026 szerint az Audio Focus kötelező minden hangot lejátszó alkalmazás számára — nélküle a Google Play elutasíthatja a frissítést.
Főbb pontok
Audio Focus — egy központosított hangarbitrációs rendszer Androidban. Amikor egy alkalmazás fókuszt kér, a rendszer ellenőrzi, hogy van-e aktív fókusz „tulajdonos", és értesítést küld neki az elvesztésről. A tulajdonos a fókusz típusától függően elhalkíthatja a hangot (duck), szüneteltetheti a lejátszást, vagy figyelmen kívül hagyhatja.
Az Android 8.0 előtt a fókuszt az AudioManager.requestAudioFocus(callback, stream, durationHint) kezelte. Az Android 8.0-tól megjelent az AudioFocusRequest, amely lehetővé tette a kérelem típusának és a fókusz automatikus visszaállításának megadását. Az Android 12-ben a mechanizmus megerősödött — az összes médialejátszónak helyesen kell kezelnie a fókuszt a Google Play-ben való megjelenéshez.
A Google I/O 2024 szerint a hangalkalmazások értékeléseiben a felhasználói panaszok körülbelül 15%-a a hangok átfedésével kapcsolatos. Az Audio Focus helyes implementálása megoldja ezt a problémát, és 30%-kal javítja a felhasználói élményt a hallgatási idő tekintetében.
Fontos megérteni, hogy az Audio Focus nem kezeli automatikusan a lejátszást. Csak értesíti az alkalmazást a fókusz eseményeiről. Az alkalmazás maga dönti el: szünetelteti a lejátszót, csökkenti a hangerőt, vagy folytatja a lejátszást. A rendszer nem kényszerít — ez egy architekturális döntés, amelyet a fejlesztőre bíznak.
Kivételt képeznek a navigációs alkalmazások (Google Maps, Yandex.Maps). Ezek AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK típusú fókuszt kérhetnek, amelynél a meglévő lejátszó elhalkul, és a hangutasítások fölötte szólnak. Az utasítás befejezése után a lejátszó automatikusan visszaállítja a hangerőt.
A rendszer egyetlen aktív audiofókusz-tulajdonost tart fenn. Amikor egy új alkalmazás fókuszt kér, a rendszer meghatározza a prioritást, és eseményt küld a jelenlegi tulajdonosnak. Ha a jelenlegi tulajdonos figyelmen kívül hagyja az eseményt, és hangosan tovább játszik, a rendszer nem alkalmaz szankciókat — a felelősség teljes mértékben a lejátszóé.
A fókusz kérelem tartalmazza a durationHint paramétert, amely tájékoztatja a rendszert a várható időtartamról: AUDIOFOCUS_GAIN (hosszú lejátszás — zene, podcast), AUDIOFOCUS_GAIN_TRANSIENT (rövid idejű — értesítési hang, navigáció), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (rövid idejű a meglévő lejátszó elhalkításának engedélyével).
A fókusz elvesztésekor az alkalmazás három kód egyikét kapja: AUDIOFOCUS_LOSS (hosszú távú elvesztés — másik alkalmazás zenét indított), AUDIOFOCUS_LOSS_TRANSIENT (átmeneti elvesztés — hívás, értesítés), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (átmeneti elvesztés elhalkítási lehetőséggel). Minden kód saját reakciót igényel.
A felhasználó zenét hallgat az A alkalmazásban. Bejövő hívás érkezik — a B alkalmazás (telefon) AUDIOFOCUS_GAIN_TRANSIENT-et kér. A rendszer AUDIOFOCUS_LOSS_TRANSIENT-et küld az A alkalmazásnak. A lejátszó szünetel. A hívás befejezése után a B alkalmazás elengedi a fókuszt, a rendszer AUDIOFOCUS_GAIN-en keresztül értesíti az A alkalmazást — a lejátszó folytatja a lejátszást. A teljes lánc kevesebb mint 50 ms-ig tart.
A durationHint helyes kiválasztása — kulcsfontosságú döntés az Audio Focus implementálásakor. A típusválasztás hibája vagy hangátfedéshez, vagy indokolatlan lejátszóleálláshoz, vagy a felhasználó irritációjához vezet.
| Kérelem típusa | Forgatókönyv | Tulajdonos reakciója |
|---|---|---|
| AUDIOFOCUS_GAIN | Zene, podcast indítása | AUDIOFOCUS_LOSS — a lejátszónak le kell állnia |
| AUDIOFOCUS_GAIN_TRANSIENT | Hívás, hangos értesítés | AUDIOFOCUS_LOSS_TRANSIENT — szünet |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | GPS-útmutatás, rövid jelzés | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — elhalkítás |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Hangkeresés, felvétel | AUDIOFOCUS_LOSS — teljes leállás |
Duck — a fő lejátszó hangerőjének ideiglenes csökkentése 20–30%-ra a másodlagos hang időtartama alatt. Az Android API-t biztosít a kézi duck-hoz az AudioManager.adjustSuggestedStreamVolume segítségével, de a legtöbb lejátszó saját eszközökkel implementálja az elhalkítást. Az Android Documentation (2026) szerint a duck feldolgozása nem tarthat tovább 3 másodpercnél, ezután a hangerő visszaáll.
Az Audio Focus helyes implementálásához három lépést kell egymás után végrehajtani: létrehozni a kérelmet, fókuszt kérni a lejátszás előtt, és kezelni az eseményt a callback-ben. Az AndroidX media AudioFocusRequestCompat használata biztosítja a kompatibilitást az Android összes verziójával.
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()
}
A fókusz kérelmet a lejátszás megkezdése előtt kell végrehajtani minden alkalommal, amikor a felhasználó megnyomja a Play gombot. Ha az eredmény AUDIOFOCUS_REQUEST_GRANTED — kezdje el a lejátszást. Ha DENIED — jelenítsen meg egy üzenetet a felhasználónak, vagy halassza el a lejátszást a fókusz megszerzéséig.
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()
}
}
}
A callback-ben fontos megkülönböztetni az AUDIOFOCUS_LOSS és az AUDIOFOCUS_LOSS_TRANSIENT között. Az első esetben a lejátszó NEM folytathatja automatikusan — a felhasználó kifejezetten másik hangot indított. A második esetben — automatikusan folytatható AUDIOFOCUS_GAIN fogadásakor. A wasPlayingBeforeLoss jelző segít emlékezni, hogy vissza kell-e állítani a lejátszást.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
Az abandonAudioFocusRequest hívás tájékoztatja a rendszert, hogy az alkalmazásnak már nincs szüksége fókuszra. Fontos ezt meghívni szünetnél és a lejátszó leállításakor. Ha a fókuszt nem engedik el, egy másik alkalmazás, amely AUDIOFOCUS_GAIN-t kér, nem kap LOSS-t, és a hangok átfedik egymást.
A fókuszvesztés helyes kezelése — kulcsfontosságú követelmény a Google Play-ellenőrzésen való áthaladáshoz. A helytelen kezelés negatív értékelésekhez vezet: a felhasználók panaszkodnak, hogy a zene továbbra is szól hívás közben vagy navigáció felett.
AUDIOFOCUS_LOSS fogadásakor a lejátszónak le kell állnia, és nem folytathatja a Play gomb kifejezett megnyomásáig. AUDIOFOCUS_LOSS_TRANSIENT (hívás, értesítés) esetén a lejátszó szünetel, és automatikusan folytatja a fókusz visszaállásakor. AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK esetén a lejátszó ideiglenesen 20–30%-ra csökkenti a hangerőt a külső hang időtartama alatt.
Az Android Developer Guide (2026) szerint a duck-ot az AudioTrack aktuális hangerőszintjének 0,2–0,3 faktorral való szorzásával kell implementálni. Ne használja az AudioManager.setStreamVolume függvényt — ez megváltoztatja a rendszer hangerőt, és befolyásol más alkalmazásokat. A duck csak a saját lejátszó oldalán hajtódik végre.
Bejövő hívás esetén a rendszer automatikusan AUDIOFOCUS_GAIN_TRANSIENT-et kér a Telefon alkalmazáson keresztül. A lejátszó AUDIOFOCUS_LOSS_TRANSIENT-et kap, és szünetel. A hívás befejezése után vagy ha a felhasználó elutasította a hívást, a fókusz visszatér — a lejátszó automatikusan folytatja a lejátszást, ha zenelejátszóról van szó.
Navigációs alkalmazásoknál (Google Maps) az AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK használatos hangutasításoknál. A lejátszó 2–3 másodpercre elhalkul, majd a hangerő visszaáll. Ha a felhasználó podcastet hallgat zene helyett, a duck helyett jobb szüneteltetni — a podcastokban minden másodperc számít.
A gyakorlatban a fejlesztők több szabványos forgatókönyvvel találkoznak, amelyekben az Audio Focus eltérően viselkedik. Tekintsük át a tipikus eseteket és a helyes reakciókat rájuk.
Fontos egy jelző implementálása, amely emlékszik, hogy a zene a fókusz elvesztése előtt szólt-e. Ha a felhasználó maga nyomta meg a szünetet, majd jött egy hívás — nem kell folytatni. A jelző a felhasználó kifejezett szüneténél törlődik, és a lejátszás indításakor beállítódik.
A Google UX-kutatása (2024) szerint a hívás utáni automatikus folytatás 22%-kal növeli a felhasználói elégedettséget. De ha a lejátszó azután folytatja, hogy a felhasználó már elkezdett videót nézni — ez irritációt okoz. A wasPlayingBeforeLoss jelző véd a hamis folytatások ellen.
Gyakran Ismételt Kérdések
Igen, Android 12-től kezdve a Google Play ajánlja az Audio Focus implementálását minden hangot lejátszó alkalmazás számára. A Music & Audio kategóriájú alkalmazások kötelesek implementálni a publikáláshoz. A figyelmen kívül hagyás a frissítés elutasításához vezethet.
Indítsa el a lejátszót, majd nyisson meg egy másik hangos alkalmazást (például YouTube Music). A lejátszónak szünetelnie kell. Ezután zárja be a YouTube Music-ot — a lejátszónak automatikusan folytatnia kell. A duck teszthez használja a Google Maps-ot hangutasításokkal.
A rendszer közli: „Egy másik alkalmazásnak rövid hangot kell lejátszania — halkítsa el a lejátszóját". Ez optimális hangutasításokhoz és rövid értesítésekhez. A hangerő a külső hang befejezése után kézi beavatkozás nélkül visszaáll.
Formálisan igen — a rendszer nem kényszerít. De a gyakorlatban ez hangátfedést jelent. A felhasználó egyszerre hallja a zenét és a hívást, ami negatív élményhez vezet. A Google azt ajánlja, hogy mindig kezelje az AUDIOFOCUS_LOSS-t a lejátszó leállításával.
iOS-en az Audio Session tölt be hasonló szerepet, amelyet az AVAudioSession kezel. A mechanizmusok hasonlóak: a kategóriák és opciók határozzák meg a viselkedést hangátfedés esetén. Az API-k és szabályok azonban gyökeresen eltérnek — minden keretrendszer másképp van implementálva.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is