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 — 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.
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.
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.
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.
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ării | Scenariu | Reacția proprietarului |
|---|---|---|
| AUDIOFOCUS_GAIN | Pornirea muzicii, podcastului | AUDIOFOCUS_LOSS — playerul trebuie să se oprească |
| AUDIOFOCUS_GAIN_TRANSIENT | Apel, notificare vocală | AUDIOFOCUS_LOSS_TRANSIENT — pauză |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | Indicație GPS, semnal scurt | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — reducere volum |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Căutare vocală, înregistrare | AUDIOFOCUS_LOSS — oprire completă |
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.
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.
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.
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.
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 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.
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ă.
Î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.
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
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.
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.
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ă.
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.
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
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.
Citiți și