Audio Focus es un mecanismo de Android que regula el uso simultáneo de la salida de audio por varias aplicaciones. Evita la superposición de sonidos: cuando una app comienza la reproducción, el sistema automáticamente baja o pausa otra. Según Android Developer Guide, 2026, Audio Focus es obligatorio para todas las apps que reproducen audio — sin él, Google Play puede rechazar la actualización.
Puntos Clave
Audio Focus es un sistema centralizado de arbitraje de audio en Android. Cuando una app solicita el enfoque, el sistema verifica si hay un “propietario” activo del enfoque y le envía una notificación de pérdida. El propietario puede bajar el volumen (duck), pausar la reproducción o ignorarlo — según el tipo de enfoque.
Antes de Android 8.0, el enfoque se gestionaba mediante AudioManager.requestAudioFocus(callback, stream, durationHint). A partir de Android 8.0, se introdujo AudioFocusRequest, que añadió la posibilidad de especificar el tipo de solicitud y la restauración automática del enfoque. En Android 12, el mecanismo se fortaleció — todos los reproductores multimedia deben manejar correctamente el enfoque para publicarse en Google Play.
Según Google I/O 2024, alrededor del 15% de las quejas de usuarios en reseñas de apps de audio están relacionadas con la superposición de sonidos. La implementación correcta de Audio Focus resuelve este problema y mejora la experiencia del usuario en un 30% en tiempo de escucha.
Es importante entender que Audio Focus no controla la reproducción automáticamente. Solo notifica a la app sobre eventos de enfoque. La app decide si pausar el reproductor, bajar el volumen o seguir reproduciendo. El sistema no obliga — esta decisión arquitectónica queda a criterio del desarrollador.
La excepción son las apps de navegación (Google Maps, Yandex Maps). Pueden solicitar el tipo de enfoque AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, donde el reproductor existente baja su volumen mientras las indicaciones de voz suenan encima. Después de la indicación, el reproductor restaura automáticamente el volumen.
El sistema mantiene un único propietario activo del enfoque de audio. Cuando una nueva app solicita el enfoque, el sistema determina la prioridad y envía un evento al propietario actual. Si el propietario actual ignora el evento y sigue reproduciendo en voz alta, el sistema no aplica sanciones — la responsabilidad recae completamente en el reproductor.
La solicitud de enfoque incluye un parámetro durationHint que indica al sistema la duración estimada: AUDIOFOCUS_GAIN (reproducción larga — música, pódcast), AUDIOFOCUS_GAIN_TRANSIENT (corta duración — sonido de notificación, navegación), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (corta duración con permiso para bajar el volumen del reproductor existente).
Al perder el enfoque, la app recibe uno de tres códigos: AUDIOFOCUS_LOSS (pérdida prolongada — otra app inició música), AUDIOFOCUS_LOSS_TRANSIENT (pérdida temporal — llamada, notificación), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (pérdida temporal con posibilidad de bajar el volumen). Cada código requiere su propia reacción.
Un usuario escucha música en la app A. Llega una llamada — la app B (teléfono) solicita AUDIOFOCUS_GAIN_TRANSIENT. El sistema envía AUDIOFOCUS_LOSS_TRANSIENT a la app A. El reproductor se pausa. Después de la llamada, la app B libera el enfoque, el sistema notifica a la app A mediante AUDIOFOCUS_GAIN — el reproductor reanuda la reproducción. Toda la cadena toma menos de 50 ms.
Elegir el durationHint correcto es la decisión clave al implementar Audio Focus. Una elección incorrecta del tipo lleva a superposición de sonidos, detención innecesaria del reproductor o irritación del usuario.
| Tipo de solicitud | Escenario | Reacción del propietario |
|---|---|---|
| AUDIOFOCUS_GAIN | Iniciar música, pódcast | AUDIOFOCUS_LOSS — el reproductor debe detenerse |
| AUDIOFOCUS_GAIN_TRANSIENT | Llamada, notificación de voz | AUDIOFOCUS_LOSS_TRANSIENT — pausa |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | Indicación GPS, señal corta | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — bajar volumen |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Búsqueda por voz, grabación | AUDIOFOCUS_LOSS — detención completa |
Duck es una reducción temporal del volumen del reproductor principal al 20–30% mientras suena un sonido secundario. Android proporciona una API para duck manual mediante AudioManager.adjustSuggestedStreamVolume, pero la mayoría de los reproductores implementan la reducción con sus propios medios. Según la Documentación de Android (2026), el manejo de duck debe durar no más de 3 segundos, después de los cuales se restaura el volumen.
Para implementar correctamente Audio Focus, debes realizar tres pasos secuencialmente: crear una solicitud, solicitar el enfoque antes de la reproducción y manejar el evento en un callback. El uso de AudioFocusRequestCompat de AndroidX media garantiza la compatibilidad con todas las versiones de 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 solicitud de enfoque debe realizarse antes de iniciar la reproducción cada vez que el usuario presiona Play. Si el resultado es AUDIOFOCUS_REQUEST_GRANTED — comienza a reproducir. Si es DENIED — muestra un mensaje al usuario o aplaza la reproducción hasta obtener el enfoque.
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()
}
}
}
En el callback, es importante distinguir entre AUDIOFOCUS_LOSS y AUDIOFOCUS_LOSS_TRANSIENT. En el primer caso, el reproductor NO debe reanudarse automáticamente — el usuario inició explícitamente otro audio. En el segundo, puede reanudarse automáticamente al recibir AUDIOFOCUS_GAIN. El indicador wasPlayingBeforeLoss ayuda a recordar si es necesario restaurar la reproducción.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
Llamar a abandonAudioFocusRequest informa al sistema que la app ya no necesita el enfoque. Es importante llamarlo al pausar y detener el reproductor. Si no se libera el enfoque, otra app que solicite AUDIOFOCUS_GAIN no recibirá LOSS y los sonidos se superpondrán.
El manejo correcto de la pérdida de enfoque es un requisito clave para pasar la revisión de Google Play. Un manejo incorrecto lleva a reseñas negativas: los usuarios se quejan de que la música sigue sonando durante una llamada o sobre la navegación.
Al recibir AUDIOFOCUS_LOSS, el reproductor debe detenerse y no reanudarse hasta que el usuario presione Play explícitamente. En AUDIOFOCUS_LOSS_TRANSIENT (llamada, notificación), el reproductor se pausa y se reanuda automáticamente cuando se restaura el enfoque. En AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK, el reproductor reduce temporalmente el volumen al 20–30% mientras se reproduce audio externo.
Según la Guía para Desarrolladores de Android (2026), el duck debe implementarse multiplicando el nivel de volumen actual de AudioTrack por un factor de 0.2–0.3. No uses AudioManager.setStreamVolume — esto cambia el volumen del sistema y afecta a otras apps. El duck se realiza solo en el lado del reproductor.
En una llamada entrante, el sistema solicita automáticamente AUDIOFOCUS_GAIN_TRANSIENT a través de la app Teléfono. El reproductor recibe AUDIOFOCUS_LOSS_TRANSIENT y se pausa. Después de la llamada o si el usuario la rechaza, el enfoque regresa — el reproductor reanuda automáticamente la reproducción si es un reproductor de música.
Para apps de navegación (Google Maps), se usa AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK durante las indicaciones de voz. El reproductor baja su volumen durante 2–3 segundos, luego se restaura. Si el usuario está escuchando un pódcast en lugar de música, es mejor pausar que bajar el volumen — cada segundo importa en los pódcasts.
En la práctica, los desarrolladores se enfrentan a varios escenarios estándar donde Audio Focus se comporta de manera diferente. Veamos los casos típicos y las reacciones correctas.
Es importante implementar un indicador que recuerde si la música se estaba reproduciendo antes de la pérdida de enfoque. Si el usuario presionó pausa por sí mismo y luego llegó una llamada — no reanudar. El indicador se restablece en la pausa explícita del usuario y se establece al iniciar la reproducción.
Según la investigación de UX de Google (2024), la reanudación automática después de una llamada aumenta la satisfacción del usuario en un 22%. Pero si el reproductor se reanuda después de que el usuario ya comenzó a ver un video — esto causa irritación. El indicador wasPlayingBeforeLoss evita reanudaciones falsas.
Preguntas Frecuentes
Sí, a partir de Android 12, Google Play recomienda la implementación de Audio Focus para todas las apps que reproducen audio. Las apps de la categoría Música y Audio deben implementarlo para su publicación. Ignorarlo puede llevar al rechazo de la actualización.
Inicia tu reproductor, luego abre otra app de audio (por ejemplo, YouTube Music). Tu reproductor debería pausarse. Luego cierra YouTube Music — el reproductor debería reanudarse automáticamente. Para una prueba de duck, usa Google Maps con indicaciones de voz.
El sistema dice: “Otra app necesita reproducir brevemente un sonido corto — baja el volumen de tu reproductor”. Esto es óptimo para indicaciones de voz y notificaciones cortas. El volumen se restaura después de que termina el audio externo sin intervención manual.
Formalmente sí — el sistema no obliga. Pero en la práctica esto significa superposición de sonidos. El usuario escuchará música y una llamada simultáneamente, lo que lleva a una experiencia negativa. Google recomienda manejar siempre AUDIOFOCUS_LOSS deteniendo el reproductor.
En iOS, el rol equivalente lo desempeña Audio Session, gestionado a través de AVAudioSession. Los mecanismos son similares: las categorías y opciones definen el comportamiento durante la superposición de sonidos. Sin embargo, la API y las reglas difieren significativamente — cada framework está implementado de manera diferente.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también