Audio Focus: a fogalom lényege, módjai és kezelése Androidban

Szerző: IT Sectr Megjelenés: 2026-05-23 Olvasási idő: 8 perc

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 — az Android rendszermechanizmusa a hanglejátszás koordinálására az alkalmazások között hangátfedés nélkül.
  • A fókusz kérése az AudioManager.requestAudioFocus() segítségével történik a lejátszás típusának és időtartamának megadásával.
  • A rendszer a fókusz változásáról az AudioManager.OnAudioFocusChangeListener segítségével értesít AUDIOFOCUS_GAIN, LOSS és DUCK kódokkal.
  • Auto Resume — AUDIOFOCUS_LOSS fogadásakor az alkalmazásnak szüneteltetnie kell a lejátszást, és AUDIOFOCUS_GAIN esetén folytatnia.
  • Az Android 12+ kötelezővé teszi az AudioFocusRequestCompat használatát az AndroidX-ből a fókusz kérelem létrehozásához.

Mi az Audio Focus?

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.

Audio Focus és médialejátszás

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.

Hogyan működik az Audio Focus Androidban

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.

Az Audio Focus eseménylánca

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.

Az Audio Focus kérelem típusai és módjai

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ípusaForgatókönyvTulajdonos reakciója
AUDIOFOCUS_GAINZene, podcast indításaAUDIOFOCUS_LOSS — a lejátszónak le kell állnia
AUDIOFOCUS_GAIN_TRANSIENTHívás, hangos értesítésAUDIOFOCUS_LOSS_TRANSIENT — szünet
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKGPS-útmutatás, rövid jelzésAUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — elhalkítás
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVEHangkeresés, felvételAUDIOFOCUS_LOSS — teljes leállás

Az AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK jellemzői

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 implementálása kódban

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.

Az Audio Focus kérelem létrehozása és végrehajtása

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

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.

Callback a fókuszváltozás kezeléséhez

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

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.

Az Audio Focus elengedése

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

Az audiofókusz elvesztésének kezelése

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.

Hívások és navigáció kezelése

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.

Tipikus használati forgatókönyvek

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.

  • Zene + hívás — a lejátszó szünetel (AUDIOFOCUS_LOSS_TRANSIENT). Hívás után automatikusan folytatja, ha a felhasználó nem végzett műveletet a lejátszóban.
  • Zene + navigáció — a lejátszó elhalkul a hangutasítás idejére (DUCK). A hangerő a frázis befejezése után visszaáll.
  • A felhasználó másik alkalmazást indított — a lejátszó AUDIOFOCUS_LOSS-t kap és leáll. Folytatás csak a Play gombbal.
  • Videó + zene a háttérben — a videolejátszó AUDIOFOCUS_GAIN-t kér. A zenelejátszó LOSS-t kap és leáll.
  • Hangkeresés (Google Assistant) — az alkalmazás AUDIOFOCUS_LOSS_TRANSIENT-et kap, szünetel, és az asszisztens válasza után automatikusan folytatja.

Automatikus folytatás fókuszvesztés után

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

Kötelező az Audio Focus minden hangot tartalmazó alkalmazás számára?

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.

Hogyan ellenőrizhető, hogy az Audio Focus helyesen működik?

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.

Mi az AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK a gyakorlatban?

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.

Elutasítható az Audio Focus elvesztésére vonatkozó kérelem?

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.

Működik az Audio Focus más platformokon, mint az Android?

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

  • Audio Focus — a rendszer hangarbiterei Androidban, amely megakadályozza a különböző alkalmazások hangjainak átfedését.
  • A fókusz kérése az AudioFocusRequestCompat segítségével történik a durationHint megadásával: GAIN, TRANSIENT vagy TRANSIENT_MAY_DUCK.
  • Az OnAudioFocusChangeListener callback négy eseményt kezel: GAIN, LOSS, LOSS_TRANSIENT és LOSS_TRANSIENT_CAN_DUCK.
  • AUDIOFOCUS_LOSS esetén a lejátszó leáll, TRANSIENT esetén — szünetel automatikus folytatással, DUCK esetén — elhalkul.
  • Fontos megjegyezni a wasPlayingBeforeLoss jelzőt, hogy a lejátszás ne folytatódjon a felhasználó kifejezett szüneteltetése után.
  • A fókusz elengedése az abandonAudioFocusRequest segítségével kötelező szünetnél és a lejátszó leállításakor.
  • iOS-en az Audio Focus megfelelője az Audio Session (AVAudioSession) saját kategóriákkal és módokkal.

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.

Projekt megbeszélése

Olvassa el is