Audio Focus est un mécanisme Android qui régule l'utilisation simultanée de la sortie audio par plusieurs applications. Il empêche la superposition des sons : lorsqu'une application commence la lecture, le système réduit ou met automatiquement en pause une autre. Selon Android Developer Guide, 2026, Audio Focus est obligatoire pour toutes les applications qui lisent de l'audio — sans lui, Google Play peut rejeter la mise à jour.
Points clés
Audio Focus est un système centralisé d'arbitrage audio dans Android. Lorsqu'une application demande le focus, le système vérifie s'il y a un « propriétaire » actif du focus et lui envoie une notification de perte. Le propriétaire peut soit réduire le volume (duck), soit mettre la lecture en pause, soit l'ignorer — selon le type de focus.
Avant Android 8.0, le focus était géré via AudioManager.requestAudioFocus(callback, stream, durationHint). À partir d'Android 8.0, AudioFocusRequest a été introduit, ajoutant la possibilité de spécifier le type de demande et la restauration automatique du focus. Dans Android 12, le mécanisme a été renforcé — tous les lecteurs multimédias doivent gérer correctement le focus pour être publiés sur Google Play.
Selon Google I/O 2024, environ 15 % des plaintes d'utilisateurs dans les avis d'applications audio sont liées à la superposition des sons. Une implémentation correcte d'Audio Focus résout ce problème et améliore l'expérience utilisateur de 30 % en temps d'écoute.
Il est important de comprendre qu'Audio Focus ne contrôle pas automatiquement la lecture. Il notifie uniquement l'application des événements de focus. L'application décide elle-même : mettre le lecteur en pause, réduire le volume ou continuer à jouer. Le système ne force pas — cette décision architecturale est laissée au développeur.
L'exception concerne les applications de navigation (Google Maps, Yandex Maps). Elles peuvent demander le type de focus AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, où le lecteur existant voit son volume réduit tandis que les instructions vocales sont lues par-dessus. Après l'instruction, le lecteur restaure automatiquement le volume.
Le système maintient un seul propriétaire actif du focus audio. Lorsqu'une nouvelle application demande le focus, le système détermine la priorité et envoie un événement au propriétaire actuel. Si le propriétaire actuel ignore l'événement et continue à jouer fort, le système n'applique aucune sanction — la responsabilité incombe entièrement au lecteur.
La demande de focus inclut un paramètre durationHint qui indique au système la durée estimée : AUDIOFOCUS_GAIN (lecture longue — musique, podcast), AUDIOFOCUS_GAIN_TRANSIENT (courte durée — son de notification, navigation), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (courte durée avec permission de réduire le volume du lecteur existant).
En cas de perte de focus, l'application reçoit l'un des trois codes : AUDIOFOCUS_LOSS (perte prolongée — une autre application a lancé de la musique), AUDIOFOCUS_LOSS_TRANSIENT (perte temporaire — appel, notification), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (perte temporaire avec possibilité de réduction du volume). Chaque code nécessite sa propre réaction.
Un utilisateur écoute de la musique dans l'application A. Un appel arrive — l'application B (téléphone) demande AUDIOFOCUS_GAIN_TRANSIENT. Le système envoie AUDIOFOCUS_LOSS_TRANSIENT à l'application A. Le lecteur se met en pause. Après l'appel, l'application B libère le focus, le système notifie l'application A via AUDIOFOCUS_GAIN — le lecteur reprend la lecture. Toute la chaîne prend moins de 50 ms.
Choisir le bon durationHint est la décision clé lors de l'implémentation d'Audio Focus. Un mauvais choix de type conduit soit à une superposition de sons, soit à un arrêt inutile du lecteur, soit à l'irritation de l'utilisateur.
| Type de demande | Scénario | Réaction du propriétaire |
|---|---|---|
| AUDIOFOCUS_GAIN | Lancement de musique, podcast | AUDIOFOCUS_LOSS — le lecteur doit s'arrêter |
| AUDIOFOCUS_GAIN_TRANSIENT | Appel, notification vocale | AUDIOFOCUS_LOSS_TRANSIENT — pause |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | Instruction GPS, signal court | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — réduire le volume |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Recherche vocale, enregistrement | AUDIOFOCUS_LOSS — arrêt complet |
Duck est une réduction temporaire du volume du lecteur principal à 20–30 % pendant la lecture d'un son secondaire. Android fournit une API pour le duck manuel via AudioManager.adjustSuggestedStreamVolume, mais la plupart des lecteurs implémentent le duck par leurs propres moyens. Selon la Documentation Android (2026), le traitement du duck ne doit pas durer plus de 3 secondes, après quoi le volume est restauré.
Pour implémenter correctement Audio Focus, vous devez effectuer trois étapes séquentiellement : créer une demande, demander le focus avant la lecture et gérer l'événement dans un callback. L'utilisation d'AudioFocusRequestCompat d'AndroidX media garantit la compatibilité avec toutes les versions d'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 demande de focus doit être effectuée avant le début de la lecture chaque fois que l'utilisateur appuie sur Play. Si le résultat est AUDIOFOCUS_REQUEST_GRANTED — commencez à jouer. Si DENIED — affichez un message à l'utilisateur ou reportez la lecture jusqu'à l'obtention du 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()
}
}
}
Dans le callback, il est important de distinguer AUDIOFOCUS_LOSS et AUDIOFOCUS_LOSS_TRANSIENT. Dans le premier cas, le lecteur NE doit PAS reprendre automatiquement — l'utilisateur a explicitement lancé un autre audio. Dans le second, il peut reprendre automatiquement à la réception d'AUDIOFOCUS_GAIN. Le drapeau wasPlayingBeforeLoss aide à se souvenir si la lecture doit être restaurée.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
L'appel à abandonAudioFocusRequest informe le système que l'application n'a plus besoin du focus. Il est important de l'appeler lors de la mise en pause et de l'arrêt du lecteur. Si le focus n'est pas libéré, une autre application demandant AUDIOFOCUS_GAIN ne recevra pas LOSS et les sons se superposeront.
La gestion correcte de la perte de focus est une exigence clé pour passer la révision Google Play. Une gestion incorrecte entraîne des avis négatifs : les utilisateurs se plaignent que la musique continue de jouer pendant un appel ou par-dessus la navigation.
À la réception d'AUDIOFOCUS_LOSS, le lecteur doit s'arrêter et ne reprendre que lorsque l'utilisateur appuie explicitement sur Play. En cas d'AUDIOFOCUS_LOSS_TRANSIENT (appel, notification), le lecteur se met en pause et reprend automatiquement lorsque le focus est restauré. En cas d'AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK, le lecteur réduit temporairement le volume à 20–30 % pendant la lecture de l'audio externe.
Selon le Guide du Développeur Android (2026), le duck doit être implémenté en multipliant le niveau de volume actuel d'AudioTrack par un facteur de 0,2–0,3. N'utilisez pas AudioManager.setStreamVolume — cela modifie le volume système et affecte les autres applications. Le duck est effectué uniquement du côté de son propre lecteur.
Lors d'un appel entrant, le système demande automatiquement AUDIOFOCUS_GAIN_TRANSIENT via l'application Téléphone. Le lecteur reçoit AUDIOFOCUS_LOSS_TRANSIENT et se met en pause. Après la fin de l'appel ou si l'utilisateur refuse l'appel, le focus revient — le lecteur reprend automatiquement la lecture s'il s'agit d'un lecteur de musique.
Pour les applications de navigation (Google Maps), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK est utilisé pendant les instructions vocales. Le lecteur est atténué pendant 2–3 secondes, puis le volume est restauré. Si l'utilisateur écoute un podcast plutôt que de la musique, il est préférable de mettre en pause plutôt que d'atténuer — chaque seconde compte dans les podcasts.
Dans la pratique, les développeurs rencontrent plusieurs scénarios standard où Audio Focus se comporte différemment. Examinons les cas typiques et les réactions correctes.
Il est important d'implémenter un drapeau qui mémorise si la musique était en cours de lecture avant la perte de focus. Si l'utilisateur a lui-même mis en pause puis qu'un appel est arrivé — ne pas reprendre. Le drapeau est réinitialisé lors de la pause explicite de l'utilisateur et est défini au démarrage de la lecture.
Selon les recherches UX de Google (2024), la reprise automatique après un appel augmente la satisfaction des utilisateurs de 22 %. Mais si le lecteur reprend après que l'utilisateur a déjà commencé à regarder une vidéo — cela provoque de l'irritation. Le drapeau wasPlayingBeforeLoss empêche les reprises intempestives.
Foire aux questions
Oui, à partir d'Android 12, Google Play recommande l'implémentation d'Audio Focus pour toutes les applications qui lisent de l'audio. Les applications de la catégorie Musique et Audio doivent l'implémenter pour publication. L'ignorer peut entraîner le rejet de la mise à jour.
Lancez votre lecteur, puis ouvrez une autre application audio (par exemple, YouTube Music). Votre lecteur devrait se mettre en pause. Fermez ensuite YouTube Music — le lecteur devrait reprendre automatiquement. Pour un test de duck, utilisez Google Maps avec des instructions vocales.
Le système dit : « Une autre application a besoin de lire brièvement un son court — atténue ton lecteur. » C'est optimal pour les instructions vocales et les notifications courtes. Le volume est restauré après la fin de l'audio externe sans intervention manuelle.
Formellement oui — le système ne force pas. Mais en pratique, cela signifie une superposition de sons. L'utilisateur entendra la musique et un appel simultanément, ce qui conduit à une expérience négative. Google recommande de toujours gérer AUDIOFOCUS_LOSS en arrêtant le lecteur.
Sur iOS, le rôle équivalent est joué par Audio Session, géré via AVAudioSession. Les mécanismes sont similaires : les catégories et options définissent le comportement lors de la superposition des sons. Cependant, l'API et les règles diffèrent considérablement — chaque framework est implémenté à sa manière.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi