Audio Focus: esența conceptului, modurile și gestionarea în Android

Autor: IT Sectr Publicat: 2026-05-23 Timp de citire: 8 min

Audio Focus — mecanismul Android care reglementează utilizarea simultană a ieșirii audio de către mai multe aplicații. Previne suprapunerea sunetelor: când o aplicație începe redarea, sistemul reduce automat volumul sau întrerupe cealaltă. Potrivit Android Developer Guide, 2026, Audio Focus este obligatoriu pentru toate aplicațiile care redau audio — fără el Google Play poate respinge actualizarea.

Principalele puncte

  • Audio Focus — mecanismul de sistem Android pentru coordonarea redării audio între aplicații fără suprapunerea sunetelor.
  • Solicitarea focalizării se face prin AudioManager.requestAudioFocus() cu specificarea tipului și duratei redării.
  • Sistemul notifică despre schimbarea focalizării prin AudioManager.OnAudioFocusChangeListener cu codurile AUDIOFOCUS_GAIN, LOSS și DUCK.
  • Auto Resume — la primirea AUDIOFOCUS_LOSS aplicația trebuie să întrerupă redarea și să reia la AUDIOFOCUS_GAIN.
  • Android 12+ necesită utilizarea obligatorie a AudioFocusRequestCompat din AndroidX pentru crearea solicitării de focalizare.

Ce este Audio Focus?

Audio Focus — este un sistem centralizat de arbitraj audio în Android. Când o aplicație solicită focalizarea, sistemul verifică dacă există un «proprietar» activ al focalizării și îi trimite o notificare de pierdere. Proprietarul poate fie să reducă volumul (duck), fie să întrerupă redarea, fie să ignore — în funcție de tipul focalizării.

Înainte de Android 8.0, focalizarea era gestionată prin AudioManager.requestAudioFocus(callback, stream, durationHint). Începând cu Android 8.0, a apărut AudioFocusRequest, care a adăugat posibilitatea de a specifica tipul solicitării și restaurarea automată a focalizării. În Android 12 mecanismul a fost întărit — toate playerele media trebuie să gestioneze corect focalizarea pentru publicarea în Google Play.

Potrivit Google I/O 2024, aproximativ 15% din plângerile utilizatorilor în recenziile aplicațiilor audio sunt legate de suprapunerea sunetelor. Implementarea corectă a Audio Focus rezolvă această problemă și îmbunătățește experiența utilizatorului cu 30% în ceea ce privește timpul de ascultare.

Audio Focus și redarea media

Este important să înțelegeți că Audio Focus nu gestionează redarea automat. El doar notifică aplicația despre evenimentele de focalizare. Aplicația decide singură: să întrerupă playerul, să reducă volumul sau să continue redarea. Sistemul nu forțează — aceasta este o decizie arhitecturală lăsată la latitudinea dezvoltatorului.

Excepție fac aplicațiile de navigație (Google Maps, Yandex.Maps). Ele pot solicita focalizarea de tip AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, la care playerul existent este redus ca volum, iar indicațiile vocale sună deasupra. După terminarea indicației, playerul restabilește automat volumul.

Cum funcționează Audio Focus în Android

Sistemul menține un singur proprietar activ al focalizării audio. La solicitarea focalizării de către o nouă aplicație, sistemul determină prioritatea și trimite un eveniment proprietarului curent. Dacă proprietarul curent ignoră evenimentul și continuă să redea cu volum ridicat, sistemul nu aplică sancțiuni — responsabilitatea revine complet playerului.

Solicitarea de focalizare include parametrul durationHint, care informează sistemul despre durata preconizată: AUDIOFOCUS_GAIN (redare lungă — muzică, podcast), AUDIOFOCUS_GAIN_TRANSIENT (scurtă — sunet de notificare, navigație), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (scurtă cu permisiunea de a reduce volumul playerului existent).

La pierderea focalizării, aplicația primește unul dintre cele trei coduri: AUDIOFOCUS_LOSS (pierdere lungă — o altă aplicație a pornit muzica), AUDIOFOCUS_LOSS_TRANSIENT (pierdere temporară — apel, notificare), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (pierdere temporară cu posibilitatea de reducere a volumului). Fiecare cod necesită propria reacție.

Lanțul de evenimente Audio Focus

Utilizatorul ascultă muzică în aplicația A. Sosește un apel — aplicația B (telefon) solicită AUDIOFOCUS_GAIN_TRANSIENT. Sistemul trimite AUDIOFOCUS_LOSS_TRANSIENT aplicației A. Playerul se întrerupe. După terminarea apelului, aplicația B eliberează focalizarea, sistemul notifică aplicația A prin AUDIOFOCUS_GAIN — playerul reia redarea. Întregul lanț durează mai puțin de 50 ms.

Tipurile și modurile de solicitare Audio Focus

Alegerea corectă a durationHint — decizia cheie la implementarea Audio Focus. O eroare în alegerea tipului duce fie la suprapunerea sunetelor, fie la oprirea nejustificată a playerului, fie la iritarea utilizatorului.

Tipul solicităriiScenariuReacția proprietarului
AUDIOFOCUS_GAINPornirea muzicii, podcastuluiAUDIOFOCUS_LOSS — playerul trebuie să se oprească
AUDIOFOCUS_GAIN_TRANSIENTApel, notificare vocalăAUDIOFOCUS_LOSS_TRANSIENT — pauză
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKIndicație GPS, semnal scurtAUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — reducere volum
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVECăutare vocală, înregistrareAUDIOFOCUS_LOSS — oprire completă

Particularitățile AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK

Duck — reducerea temporară a volumului playerului principal la 20–30% pe durata sunetului secundar. Android oferă API pentru duck manual prin AudioManager.adjustSuggestedStreamVolume, dar majoritatea playerelelor implementează reducerea volumului prin propriile mijloace. Conform Android Documentation (2026), gestionarea duck nu trebuie să dureze mai mult de 3 secunde, după care volumul este restabilit.

Implementarea Audio Focus în cod

Pentru implementarea corectă a Audio Focus trebuie să parcurgeți succesiv trei pași: creați solicitarea, solicitați focalizarea înainte de redare și gestionați evenimentul în callback. Utilizarea AudioFocusRequestCompat din AndroidX media asigură compatibilitatea cu toate versiunile Android.

Crearea și executarea solicitării 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()
}

Solicitarea de focalizare trebuie efectuată înainte de începerea redării de fiecare dată când utilizatorul apasă Play. Dacă rezultatul este AUDIOFOCUS_REQUEST_GRANTED — începeți redarea. Dacă DENIED — afișați utilizatorului un mesaj sau amânați redarea până la obținerea focalizării.

Callback de gestionare a modificării focalizării

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

În callback este important să distingeți AUDIOFOCUS_LOSS de AUDIOFOCUS_LOSS_TRANSIENT. În primul caz, playerul NU trebuie să reia automat — utilizatorul a pornit explicit alt audio. În al doilea — puteți reia automat la primirea AUDIOFOCUS_GAIN. Flag-ul wasPlayingBeforeLoss ajută să rețineți dacă trebuie restaurată redarea.

Eliberarea Audio Focus

kotlin
private fun abandonAudioFocus() {
    AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}

Apelul abandonAudioFocusRequest informează sistemul că aplicația nu mai are nevoie de focalizare. Este important să îl apelați la pauză și la oprirea playerului. Dacă nu eliberați focalizarea, o altă aplicație care solicită AUDIOFOCUS_GAIN nu va primi LOSS, iar sunetele se vor suprapune.

Gestionarea pierderii focalizării audio

Gestionarea corectă a pierderii focalizării — cerința cheie pentru a trece de revizuirea Google Play. Gestionarea incorectă duce la recenzii negative: utilizatorii se plâng că muzica continuă să redea în timpul unui apel sau pe fundalul navigației.

La primirea AUDIOFOCUS_LOSS, playerul trebuie să se oprească și să nu reia până la apăsarea explicită a butonului Play. La AUDIOFOCUS_LOSS_TRANSIENT (apel, notificare), playerul se întrerupe și reia automat la restabilirea focalizării. La AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK, playerul reduce temporar volumul la 20–30% pe durata audio-ului extern.

Conform Android Developer Guide (2026), duck trebuie implementat prin înmulțirea nivelului curent de volum al AudioTrack cu un coeficient de 0,2–0,3. Nu utilizați AudioManager.setStreamVolume — aceasta modifică volumul de sistem și afectează alte aplicații. Duck se execută doar pe partea propriului player.

Gestionarea apelurilor și navigației

La un apel primit, sistemul solicită automat AUDIOFOCUS_GAIN_TRANSIENT prin aplicația Telefon. Playerul primește AUDIOFOCUS_LOSS_TRANSIENT și se întrerupe. După terminarea apelului sau dacă utilizatorul a respins apelul, focalizarea revine — playerul reia automat redarea, dacă este un player muzical.

Pentru aplicațiile de navigație (Google Maps) se utilizează AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK la indicațiile vocale. Playerul este redus ca volum pentru 2–3 secunde, apoi volumul este restabilit. Dacă utilizatorul ascultă un podcast, nu muzică, în loc de duck este mai bine să întrerupeți — în podcasturi fiecare secundă contează.

Scenarii tipice de utilizare

În practică, dezvoltatorii întâlnesc câteva scenarii standard în care Audio Focus se comportă diferit. Să examinăm cazurile tipice și reacțiile corecte la ele.

  • Muzică + apel — playerul se întrerupe (AUDIOFOCUS_LOSS_TRANSIENT). După apel reia automat, dacă utilizatorul nu a efectuat acțiuni în player.
  • Muzică + navigație — playerul este redus ca volum pe durata indicației vocale (DUCK). Volumul este restabilit după terminarea frazei.
  • Utilizatorul a pornit altă aplicație — playerul primește AUDIOFOCUS_LOSS și se oprește. Reluarea doar prin butonul Play.
  • Video + muzică în fundal — playerul video solicită AUDIOFOCUS_GAIN. Playerul muzical primește LOSS și se oprește.
  • Căutare vocală (Google Assistant) — aplicația primește AUDIOFOCUS_LOSS_TRANSIENT, se întrerupe și reia automat după răspunsul asistentului.

Reluarea automată după pierderea focalizării

Este important să implementați un flag care reține dacă muzica reda înainte de pierderea focalizării. Dacă utilizatorul a apăsat singur pauză, iar apoi a venit un apel — nu trebuie să reiați. Flag-ul se resetează la pauza explicită a utilizatorului și se setează la pornirea redării.

Conform cercetărilor UX Google (2024), reluarea automată după un apel crește satisfacția utilizatorilor cu 22%. Dar dacă playerul reia după ce utilizatorul a început deja să vizioneze un video — aceasta provoacă iritare. Flag-ul wasPlayingBeforeLoss protejează împotriva reluărilor false.

Întrebări frecvente

Este Audio Focus obligatoriu pentru toate aplicațiile audio?

Da, începând cu Android 12, Google Play recomandă implementarea Audio Focus pentru toate aplicațiile care redau audio. Aplicațiile din categoria Music & Audio sunt obligate să îl implementeze pentru publicare. Ignorarea poate duce la respingerea actualizării.

Cum verific că Audio Focus funcționează corect?

Porniți playerul, apoi deschideți altă aplicație cu audio (de exemplu, YouTube Music). Playerul dvs. ar trebui să se întrerupă. Apoi închideți YouTube Music — playerul ar trebui să reia automat. Pentru testul duck, utilizați Google Maps cu indicații vocale.

Ce este AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK în practică?

Sistemul informează: «O altă aplicație trebuie să redea un sunet scurt — reduce volumul playerului tău». Este optim pentru indicații vocale și notificări scurte. Volumul este restabilit după terminarea audio-ului extern fără intervenție manuală.

Se poate respinge solicitarea de pierdere a Audio Focus?

Formal, da — sistemul nu forțează. Dar în practică aceasta înseamnă suprapunerea sunetelor. Utilizatorul va auzi simultan muzică și apel, ceea ce duce la o experiență negativă. Google recomandă să gestionați întotdeauna AUDIOFOCUS_LOSS prin oprirea playerului.

Funcționează Audio Focus pe alte platforme în afară de Android?

Pe iOS, un rol analogic îl joacă Audio Session, gestionată prin AVAudioSession. Mecanismele sunt similare: categoriile și opțiunile determină comportamentul la suprapunerea sunetelor. Cu toate acestea, API-ul și regulile diferă radical — fiecare framework este implementat diferit.

Concluzii

  • Audio Focus — arbitrul de sistem audio în Android, care previne suprapunerea sunetelor din diferite aplicații.
  • Solicitarea focalizării se face prin AudioFocusRequestCompat cu specificarea durationHint: GAIN, TRANSIENT sau TRANSIENT_MAY_DUCK.
  • Callback-ul OnAudioFocusChangeListener gestionează patru evenimente: GAIN, LOSS, LOSS_TRANSIENT și LOSS_TRANSIENT_CAN_DUCK.
  • La AUDIOFOCUS_LOSS playerul se oprește, la TRANSIENT — se întrerupe cu reluare automată, la DUCK — se reduce volumul.
  • Este important să rețineți flag-ul wasPlayingBeforeLoss pentru a nu relua redarea după pauza explicită a utilizatorului.
  • Eliberarea focalizării prin abandonAudioFocusRequest este obligatorie la pauză și la oprirea playerului.
  • Pe iOS, echivalentul Audio Focus este Audio Session (AVAudioSession) cu propriile categorii și moduri.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și