Audio Focus — en Android-mekanism som reglerar samtidig användning av ljudutgången av flera applikationer. Det förhindrar ljudöverlappning: när en applikation börjar spela, dämpar eller pausar systemet automatiskt den andra. Enligt Android Developer Guide, 2026 är Audio Focus obligatoriskt för alla applikationer som spelar upp ljud — utan det kan Google Play avvisa uppdateringen.
Huvudpunkter
Audio Focus — ett centraliserat ljudskiljedomssystem i Android. När en applikation begär fokus kontrollerar systemet om det finns en aktiv «ägare» av fokus och skickar ett meddelande om förlust till denne. Ägaren kan antingen dämpa ljudet (duck), pausa uppspelningen eller ignorera — beroende på fokustyp.
Före Android 8.0 hanterades fokus via AudioManager.requestAudioFocus(callback, stream, durationHint). Från och med Android 8.0 kom AudioFocusRequest, som lade till möjligheten att specificera begärandetyp och automatisk fokusåterställning. I Android 12 förstärktes mekanismen — alla mediaspelare måste korrekt hantera fokus för publicering i Google Play.
Enligt Google I/O 2024 är cirka 15% av användarklagomål i recensioner av ljudapplikationer relaterade till ljudöverlappning. Korrekt implementering av Audio Focus löser detta problem och förbättrar användarupplevelsen med 30% i lyssningstid.
Det är viktigt att förstå att Audio Focus inte hanterar uppspelning automatiskt. Det meddelar bara applikationen om fokushändelser. Applikationen bestämmer själv: pausa spelaren, sänka volymen eller fortsätta spela. Systemet tvingar inte — detta är ett arkitekturbeslut som lämnas till utvecklarens bedömning.
Undantaget är navigationsapplikationer (Google Maps, Yandex.Maps). De kan begära fokus av typen AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, där den befintliga spelaren dämpas och röstinstruktioner hörs ovanpå. Efter instruktionen återställer spelaren automatiskt volymen.
Systemet upprätthåller en enda aktiv ägare av ljudfokus. När en ny applikation begär fokus bestämmer systemet prioritet och skickar en händelse till den aktuella ägaren. Om den aktuella ägaren ignorerar händelsen och fortsätter att spela högt, tillämpar systemet inga sanktioner — ansvaret ligger helt på spelaren.
Fokusbegäran inkluderar parametern durationHint, som informerar systemet om den förväntade varaktigheten: AUDIOFOCUS_GAIN (lång uppspelning — musik, podcast), AUDIOFOCUS_GAIN_TRANSIENT (kort — notifieringsljud, navigation), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (kort med tillstånd att dämpa den befintliga spelaren).
Vid fokusförlust får applikationen en av tre koder: AUDIOFOCUS_LOSS (långvarig förlust — en annan applikation startade musik), AUDIOFOCUS_LOSS_TRANSIENT (tillfällig förlust — samtal, notifiering), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (tillfällig förlust med möjlighet till dämpning). Varje kod kräver sin egen reaktion.
Användaren lyssnar på musik i applikation A. Ett samtal kommer in — applikation B (telefon) begär AUDIOFOCUS_GAIN_TRANSIENT. Systemet skickar AUDIOFOCUS_LOSS_TRANSIENT till applikation A. Spelaren pausar. Efter samtalet frigör applikation B fokus, systemet meddelar applikation A via AUDIOFOCUS_GAIN — spelaren återupptar uppspelningen. Hela kedjan tar mindre än 50 ms.
Rätt val av durationHint — det viktigaste beslutet vid implementering av Audio Focus. Ett fel i typvalet leder antingen till ljudöverlappning, onödig spelarstopp eller användarirritation.
| Begärandetyp | Scenario | Ägarens reaktion |
|---|---|---|
| AUDIOFOCUS_GAIN | Starta musik, podcast | AUDIOFOCUS_LOSS — spelaren bör stoppa |
| AUDIOFOCUS_GAIN_TRANSIENT | Samtal, röstnotifiering | AUDIOFOCUS_LOSS_TRANSIENT — paus |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | GPS-instruktion, kort signal | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — dämpning |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Röstsökning, inspelning | AUDIOFOCUS_LOSS — fullständigt stopp |
Duck — tillfällig sänkning av huvudspelarens volym till 20–30% under tiden för sekundärt ljud. Android tillhandahåller API för manuell duck via AudioManager.adjustSuggestedStreamVolume, men de flesta spelare implementerar dämpning med egna medel. Enligt Android Documentation (2026) bör duck-behandling inte pågå längre än 3 sekunder, varefter volymen återställs.
För korrekt implementering av Audio Focus måste tre steg utföras i följd: skapa begäran, begära fokus före uppspelning och hantera händelsen i callback. Användning av AudioFocusRequestCompat från AndroidX media säkerställer kompatibilitet med alla Android-versioner.
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()
}
Fokusbegäran bör utföras före start av uppspelning varje gång användaren trycker på Play. Om resultatet är AUDIOFOCUS_REQUEST_GRANTED — börja spela. Om DENIED — visa ett meddelande för användaren eller skjut upp uppspelningen tills fokus erhålls.
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()
}
}
}
I callback är det viktigt att skilja mellan AUDIOFOCUS_LOSS och AUDIOFOCUS_LOSS_TRANSIENT. I det första fallet bör spelaren INTE återuppta automatiskt — användaren har explicit startat annat ljud. I det andra — kan automatiskt återuppta vid mottagande av AUDIOFOCUS_GAIN. Flaggan wasPlayingBeforeLoss hjälper att komma ihåg om uppspelning behöver återställas.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
Anrop av abandonAudioFocusRequest informerar systemet att applikationen inte längre behöver fokus. Det är viktigt att anropa det vid paus och stopp av spelaren. Om fokus inte frigörs kommer en annan applikation som begär AUDIOFOCUS_GAIN inte att få LOSS och ljuden kommer att överlappa.
Korrekt hantering av fokusförlust — ett nyckelkrav för att klara granskningen i Google Play. Felaktig hantering leder till negativa recensioner: användare klagar på att musiken fortsätter spela under ett samtal eller över navigation.
Vid mottagande av AUDIOFOCUS_LOSS bör spelaren stoppa och inte återuppta förrän explicit tryck på Play. Vid AUDIOFOCUS_LOSS_TRANSIENT (samtal, notifiering) pausar spelaren och återupptar automatiskt vid fokusåterställning. Vid AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK sänker spelaren tillfälligt volymen till 20–30% under externt ljud.
Enligt Android Developer Guide (2026) bör duck implementeras genom att multiplicera AudioTracks aktuella volymnivå med en faktor 0,2–0,3. Använd inte AudioManager.setStreamVolume — detta ändrar systemvolymen och påverkar andra applikationer. Duck utförs endast på den egna spelarens sida.
Vid inkommande samtal begär systemet automatiskt AUDIOFOCUS_GAIN_TRANSIENT via Telefon-applikationen. Spelaren får AUDIOFOCUS_LOSS_TRANSIENT och pausar. Efter samtalet eller om användaren avvisade samtalet, återkommer fokus — spelaren återupptar automatiskt uppspelningen, om det är en musikspelare.
För navigationsapplikationer (Google Maps) används AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK vid röstinstruktioner. Spelaren dämpas i 2–3 sekunder, därefter återställs volymen. Om användaren lyssnar på en podcast istället för musik, är det bättre att pausa än att ducka — i podcaster räknas varje sekund.
I praktiken stöter utvecklare på flera standardscenarier där Audio Focus beter sig olika. Låt oss titta på typiska fall och korrekta reaktioner på dem.
Det är viktigt att implementera en flagga som kommer ihåg om musiken spelade före förlusten av fokus. Om användaren själv tryckte på paus och sedan kom ett samtal — behöver inte återuppta. Flaggan återställs vid användarens explicita paus och sätts vid start av uppspelning.
Enligt Google UX-forskning (2024) ökar automatisk återupptagning efter samtal användarnöjdheten med 22%. Men om spelaren återupptar efter att användaren redan börjat titta på video — orsakar detta irritation. Flaggan wasPlayingBeforeLoss skyddar mot falska återupptagningar.
Vanliga frågor
Ja, från och med Android 12 rekommenderar Google Play implementering av Audio Focus för alla applikationer som spelar upp ljud. Applikationer i kategorin Music & Audio måste implementera det för publicering. Ignorering kan leda till avvisning av uppdateringen.
Starta spelaren, öppna sedan en annan applikation med ljud (till exempel YouTube Music). Din spelare bör pausa. Stäng sedan YouTube Music — spelaren bör automatiskt återuppta. För duck-test, använd Google Maps med röstinstruktioner.
Systemet meddelar: «En annan applikation måste spela ett kort ljud — dämpa din spelare». Detta är optimalt för röstinstruktioner och korta notifieringar. Volymen återställs efter externt ljud utan manuell inblandning.
Formellt ja — systemet tvingar inte. Men i praktiken betyder detta ljudöverlappning. Användaren hör samtidigt musik och samtal, vilket leder till en negativ upplevelse. Google rekommenderar att alltid hantera AUDIOFOCUS_LOSS genom att stoppa spelaren.
På iOS spelar Audio Session, hanterad via AVAudioSession, en liknande roll. Mekanismerna är liknande: kategorier och alternativ bestämmer beteendet vid ljudöverlappning. API och regler skiljer sig dock radikalt — varje ramverk är implementerat på sitt eget sätt.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också