Audio Focus: begreppets kärna, lägen och hantering i Android

Författare: IT Sectr Publicerad: 2026-05-23 Lästid: 8 min

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 — Androids systemmekanism för att koordinera ljuduppspelning mellan applikationer utan ljudöverlappning.
  • Fokusbegäran utförs via AudioManager.requestAudioFocus() med angivelse av typ och varaktighet för uppspelning.
  • Systemet meddelar om fokusändring via AudioManager.OnAudioFocusChangeListener med koderna AUDIOFOCUS_GAIN, LOSS och DUCK.
  • Auto Resume — vid mottagande av AUDIOFOCUS_LOSS bör applikationen pausa uppspelningen och återuppta vid AUDIOFOCUS_GAIN.
  • Android 12+ kräver obligatorisk användning av AudioFocusRequestCompat från AndroidX för att skapa en fokusbegäran.

Vad är Audio Focus?

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.

Audio Focus och mediauppspelning

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.

Hur Audio Focus fungerar i Android

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.

Kedja av Audio Focus-händelser

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.

Typer och lägen för Audio Focus-begäran

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ärandetypScenarioÄgarens reaktion
AUDIOFOCUS_GAINStarta musik, podcastAUDIOFOCUS_LOSS — spelaren bör stoppa
AUDIOFOCUS_GAIN_TRANSIENTSamtal, röstnotifieringAUDIOFOCUS_LOSS_TRANSIENT — paus
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKGPS-instruktion, kort signalAUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — dämpning
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVERöstsökning, inspelningAUDIOFOCUS_LOSS — fullständigt stopp

Egenskaper för AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK

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.

Implementering av Audio Focus i kod

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.

Skapa och utföra Audio Focus-begäran

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

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.

Callback för fokusändringshantering

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

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.

Frigöra Audio Focus

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

Hantering av ljudfokusförlust

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.

Hantering av samtal och navigation

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.

Typiska användningsscenarier

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.

  • Musik + samtal — spelaren pausar (AUDIOFOCUS_LOSS_TRANSIENT). Efter samtalet återupptas automatiskt om användaren inte utfört åtgärder i spelaren.
  • Musik + navigation — spelaren dämpas under röstinstruktionen (DUCK). Volymen återställs efter frasen.
  • Användaren startade en annan applikation — spelaren får AUDIOFOCUS_LOSS och stoppar. Återupptagning endast via Play-knappen.
  • Video + musik i bakgrunden — videospelaren begär AUDIOFOCUS_GAIN. Musikspelaren får LOSS och stoppar.
  • Röstsökning (Google Assistant) — applikationen får AUDIOFOCUS_LOSS_TRANSIENT, pausar och återupptas automatiskt efter assistentens svar.

Automatisk återupptagning efter fokusförlust

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

Är Audio Focus obligatoriskt för alla ljudapplikationer?

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.

Hur kontrollerar jag att Audio Focus fungerar korrekt?

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.

Vad är AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK i praktiken?

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.

Kan en begäran om Audio Focus-förlust avvisas?

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.

Fungerar Audio Focus på andra plattformar än Android?

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

  • Audio Focus — systemets ljudskiljedomare i Android som förhindrar ljudöverlappning från olika applikationer.
  • Fokusbegäran utförs via AudioFocusRequestCompat med angivelse av durationHint: GAIN, TRANSIENT eller TRANSIENT_MAY_DUCK.
  • Callback OnAudioFocusChangeListener hanterar fyra händelser: GAIN, LOSS, LOSS_TRANSIENT och LOSS_TRANSIENT_CAN_DUCK.
  • Vid AUDIOFOCUS_LOSS stoppar spelaren, vid TRANSIENT — pausar med automatisk återupptagning, vid DUCK — dämpas.
  • Det är viktigt att komma ihåg flaggan wasPlayingBeforeLoss för att inte återuppta uppspelning efter användarens explicita paus.
  • Frigöring av fokus via abandonAudioFocusRequest är obligatoriskt vid paus och stopp av spelaren.
  • På iOS är motsvarigheten till Audio Focus Audio Session (AVAudioSession) med egna kategorier och lägen.

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.

Diskutera projektet

Läs också