Audio Focus è un meccanismo Android che regola l'uso simultaneo dell'uscita audio da più applicazioni. Impedisce la sovrapposizione dei suoni: quando un'app avvia la riproduzione, il sistema abbassa o mette automaticamente in pausa un'altra. Secondo Android Developer Guide, 2026, Audio Focus è obbligatorio per tutte le app che riproducono audio — senza di esso, Google Play può rifiutare l'aggiornamento.
Punti Chiave
Audio Focus è un sistema centralizzato di arbitraggio audio in Android. Quando un'app richiede il focus, il sistema verifica se esiste un “proprietario” attivo del focus e gli invia una notifica di perdita. Il proprietario può abbassare il volume (duck), mettere in pausa la riproduzione o ignorare — a seconda del tipo di focus.
Prima di Android 8.0, il focus era gestito tramite AudioManager.requestAudioFocus(callback, stream, durationHint). A partire da Android 8.0, è stato introdotto AudioFocusRequest, che ha aggiunto la possibilità di specificare il tipo di richiesta e il ripristino automatico del focus. In Android 12 il meccanismo è stato rafforzato — tutti i lettori multimediali devono gestire correttamente il focus per essere pubblicati su Google Play.
Secondo Google I/O 2024, circa il 15% dei reclami degli utenti nelle recensioni delle app audio sono correlati alla sovrapposizione dei suoni. L'implementazione corretta di Audio Focus risolve questo problema e migliora l'esperienza utente del 30% nel tempo di ascolto.
È importante capire che Audio Focus non controlla automaticamente la riproduzione. Notifica solo all'app gli eventi di focus. L'app decide da sola se mettere in pausa il lettore, abbassare il volume o continuare a riprodurre. Il sistema non forza — questa decisione architetturale è lasciata allo sviluppatore.
L'eccezione sono le app di navigazione (Google Maps, Yandex Maps). Possono richiedere il tipo di focus AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, in cui il lettore esistente viene attenuato mentre i suggerimenti vocali vengono riprodotti sopra. Dopo il suggerimento, il lettore ripristina automaticamente il volume.
Il sistema mantiene un unico proprietario attivo del focus audio. Quando una nuova app richiede il focus, il sistema determina la priorità e invia un evento al proprietario attuale. Se il proprietario attuale ignora l'evento e continua a riprodurre ad alto volume, il sistema non applica sanzioni — la responsabilità ricade interamente sul lettore.
La richiesta di focus include un parametro durationHint che comunica al sistema la durata stimata: AUDIOFOCUS_GAIN (riproduzione lunga — musica, podcast), AUDIOFOCUS_GAIN_TRANSIENT (breve durata — suono di notifica, navigazione), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (breve durata con permesso di attenuare il lettore esistente).
Alla perdita del focus, l'app riceve uno di tre codici: AUDIOFOCUS_LOSS (perdita prolungata — un'altra app ha avviato musica), AUDIOFOCUS_LOSS_TRANSIENT (perdita temporanea — chiamata, notifica), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (perdita temporanea con possibilità di attenuazione). Ogni codice richiede una propria reazione.
Un utente ascolta musica nell'app A. Arriva una chiamata — l'app B (telefono) richiede AUDIOFOCUS_GAIN_TRANSIENT. Il sistema invia AUDIOFOCUS_LOSS_TRANSIENT all'app A. Il lettore si mette in pausa. Dopo la chiamata, l'app B rilascia il focus, il sistema notifica l'app A tramite AUDIOFOCUS_GAIN — il lettore riprende la riproduzione. L'intera catena richiede meno di 50 ms.
Scegliere il durationHint corretto è la decisione chiave nell'implementazione di Audio Focus. Una scelta errata del tipo porta a sovrapposizione di suoni, arresto non necessario del lettore o irritazione dell'utente.
| Tipo di richiesta | Scenario | Reazione del proprietario |
|---|---|---|
| AUDIOFOCUS_GAIN | Avvio musica, podcast | AUDIOFOCUS_LOSS — il lettore deve fermarsi |
| AUDIOFOCUS_GAIN_TRANSIENT | Chiamata, notifica vocale | AUDIOFOCUS_LOSS_TRANSIENT — pausa |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | Indicazione GPS, segnale breve | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — attenuazione |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Ricerca vocale, registrazione | AUDIOFOCUS_LOSS — arresto completo |
Duck è una riduzione temporanea del volume del lettore principale al 20–30% mentre viene riprodotto un suono secondario. Android fornisce un'API per il duck manuale tramite AudioManager.adjustSuggestedStreamVolume, ma la maggior parte dei lettori implementa l'attenuazione con mezzi propri. Secondo la Documentazione Android (2026), la gestione del duck non dovrebbe durare più di 3 secondi, dopo i quali il volume viene ripristinato.
Per implementare correttamente Audio Focus, è necessario eseguire tre passaggi in sequenza: creare una richiesta, richiedere il focus prima della riproduzione e gestire l'evento in un callback. L'uso di AudioFocusRequestCompat da AndroidX media garantisce la compatibilità con tutte le versioni di 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()
}
La richiesta di focus deve essere effettuata prima di iniziare la riproduzione ogni volta che l'utente preme Play. Se il risultato è AUDIOFOCUS_REQUEST_GRANTED — inizia a riprodurre. Se DENIED — mostra un messaggio all'utente o posticipa la riproduzione fino all'ottenimento del focus.
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()
}
}
}
Nel callback, è importante distinguere tra AUDIOFOCUS_LOSS e AUDIOFOCUS_LOSS_TRANSIENT. Nel primo caso, il lettore NON deve riprendere automaticamente — l'utente ha avviato esplicitamente un altro audio. Nel secondo, può riprendere automaticamente alla ricezione di AUDIOFOCUS_GAIN. Il flag wasPlayingBeforeLoss aiuta a ricordare se la riproduzione deve essere ripristinata.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
Chiamare abandonAudioFocusRequest informa il sistema che l'app non ha più bisogno del focus. È importante chiamarlo in pausa e all'arresto del lettore. Se il focus non viene rilasciato, un'altra app che richiede AUDIOFOCUS_GAIN non riceverà LOSS e i suoni si sovrapporranno.
Gestire correttamente la perdita di focus è un requisito fondamentale per superare la revisione di Google Play. Una gestione scorretta porta a recensioni negative: gli utenti si lamentano che la musica continua a suonare durante una chiamata o sopra la navigazione.
Alla ricezione di AUDIOFOCUS_LOSS, il lettore deve fermarsi e non riprendere fino a quando l'utente non preme esplicitamente Play. In AUDIOFOCUS_LOSS_TRANSIENT (chiamata, notifica), il lettore si mette in pausa e riprende automaticamente quando il focus viene ripristinato. In AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK, il lettore riduce temporaneamente il volume al 20–30% durante la riproduzione di audio esterno.
Secondo la Guida per Sviluppatori Android (2026), il duck dovrebbe essere implementato moltiplicando il livello di volume corrente di AudioTrack per un fattore di 0.2–0.3. Non utilizzare AudioManager.setStreamVolume — questo modifica il volume di sistema e influisce su altre app. Il duck viene eseguito solo dal lato del proprio lettore.
In una chiamata in arrivo, il sistema richiede automaticamente AUDIOFOCUS_GAIN_TRANSIENT tramite l'app Telefono. Il lettore riceve AUDIOFOCUS_LOSS_TRANSIENT e si mette in pausa. Dopo la chiamata o se l'utente rifiuta la chiamata, il focus ritorna — il lettore riprende automaticamente la riproduzione se è un lettore musicale.
Per le app di navigazione (Google Maps), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK viene utilizzato durante i suggerimenti vocali. Il lettore viene attenuato per 2–3 secondi, poi il volume viene ripristinato. Se l'utente sta ascoltando un podcast invece di musica, è meglio mettere in pausa piuttosto che attenuare — ogni secondo conta nei podcast.
Nella pratica, gli sviluppatori si imbattono in diversi scenari standard in cui Audio Focus si comporta diversamente. Esaminiamo i casi tipici e le reazioni corrette.
È importante implementare un flag che ricordi se la musica stava suonando prima della perdita di focus. Se l'utente ha premuto pausa da solo e poi è arrivata una chiamata — non riprendere. Il flag viene resettato alla pausa esplicita dell'utente e viene impostato all'avvio della riproduzione.
Secondo la ricerca UX di Google (2024), la ripresa automatica dopo una chiamata aumenta la soddisfazione dell'utente del 22%. Ma se il lettore riprende dopo che l'utente ha già iniziato a guardare un video — questo causa irritazione. Il flag wasPlayingBeforeLoss previene riprese errate.
Domande frequenti
Sì, a partire da Android 12, Google Play raccomanda l'implementazione di Audio Focus per tutte le app che riproducono audio. Le app della categoria Musica e Audio devono implementarlo per la pubblicazione. Ignorarlo può portare al rifiuto dell'aggiornamento.
Avvia il tuo lettore, poi apri un'altra app audio (ad esempio, YouTube Music). Il tuo lettore dovrebbe mettersi in pausa. Quindi chiudi YouTube Music — il lettore dovrebbe riprendere automaticamente. Per un test di duck, usa Google Maps con suggerimenti vocali.
Il sistema dice: “Un'altra app deve riprodurre brevemente un suono corto — attenua il tuo lettore.” Questo è ottimale per suggerimenti vocali e notifiche brevi. Il volume viene ripristinato dopo la fine dell'audio esterno senza intervento manuale.
Formalmente sì — il sistema non forza. Ma in pratica questo significa sovrapposizione di suoni. L'utente sentirà musica e una chiamata simultaneamente, portando a un'esperienza negativa. Google raccomanda di gestire sempre AUDIOFOCUS_LOSS fermando il lettore.
Su iOS, il ruolo equivalente è svolto da Audio Session, gestito tramite AVAudioSession. I meccanismi sono simili: categorie e opzioni definiscono il comportamento durante la sovrapposizione dei suoni. Tuttavia, l'API e le regole differiscono significativamente — ogni framework è implementato a modo suo.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche