Audio Focus — механизм Android, который регулирует одновременное использование аудиовыхода несколькими приложениями. Он предотвращает наложение звуков: когда одно приложение начинает воспроизведение, система автоматически приглушает или приостанавливает другое. По данным Android Developer Guide, 2026, Audio Focus обязателен для всех приложений, воспроизводящих аудио, — без него Google Play может отклонить обновление.
Главное
Audio Focus — это централизованная система арбитража аудио в Android. Когда одно приложение запрашивает фокус, система проверяет, есть ли активный «владелец» фокуса, и отправляет ему уведомление о потере. Владелец может либо приглушить звук (duck), либо приостановить воспроизведение, либо проигнорировать — в зависимости от типа фокуса.
До Android 8.0 фокус управлялся через AudioManager.requestAudioFocus(callback, stream, durationHint). Начиная с Android 8.0, появился AudioFocusRequest, который добавил возможность указывать тип запроса и автоматическое восстановление фокуса. В Android 12 механизм был усилен — все медиаплееры обязаны корректно обрабатывать фокус для публикации в Google Play.
По данным Google I/O 2024, около 15% жалоб пользователей в отзывах на аудиоприложения связаны с наложением звуков. Правильная реализация Audio Focus решает эту проблему и улучшает пользовательский опыт на 30% по времени прослушивания.
Важно понимать, что Audio Focus не управляет воспроизведением автоматически. Он только уведомляет приложение о событиях фокуса. Приложение само решает: приостановить плеер, понизить громкость или продолжить играть. Система не принуждает — это архитектурное решение оставлено на усмотрение разработчика.
Исключение — приложения с навигацией (Google Maps, Яндекс.Карты). Они могут запросить фокус типа AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, при котором существующий плеер приглушается, а голосовые подсказки звучат поверх. После завершения подсказки плеер автоматически восстанавливает громкость.
Система поддерживает единственного активного владельца аудиофокуса. При запросе фокуса новым приложением система определяет приоритет и отправляет событие текущему владельцу. Если текущий владелец игнорирует событие и продолжает играть громко, система не применяет санкций — ответственность полностью на плеере.
Запрос фокуса включает параметр durationHint, который сообщает системе предполагаемую длительность: AUDIOFOCUS_GAIN (длительное воспроизведение — музыка, подкаст), AUDIOFOCUS_GAIN_TRANSIENT (кратковременное — звук уведомления, навигация), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (кратковременное с разрешением приглушить существующий плеер).
При потере фокуса приложение получает один из трёх кодов: AUDIOFOCUS_LOSS (длительная потеря — другое приложение запустило музыку), AUDIOFOCUS_LOSS_TRANSIENT (временная потеря — звонок, уведомление), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (временная потеря с возможностью приглушения). Каждый код требует своей реакции.
Пользователь слушает музыку в приложении A. Приходит звонок — приложение B (телефон) запрашивает AUDIOFOCUS_GAIN_TRANSIENT. Система отправляет AUDIOFOCUS_LOSS_TRANSIENT приложению A. Плеер приостанавливается. После завершения звонка приложение B отпускает фокус, система уведомляет приложение A через AUDIOFOCUS_GAIN — плеер возобновляет воспроизведение. Вся цепочка занимает менее 50 мс.
Правильный выбор durationHint — ключевое решение при реализации Audio Focus. Ошибка в выборе типа приводит либо к наложению звуков, либо к неоправданной остановке плеера, либо к раздражению пользователя.
| Тип запроса | Сценарий | Реакция владельца |
|---|---|---|
| AUDIOFOCUS_GAIN | Запуск музыки, подкаста | AUDIOFOCUS_LOSS — плеер должен остановиться |
| AUDIOFOCUS_GAIN_TRANSIENT | Звонок, голосовое уведомление | AUDIOFOCUS_LOSS_TRANSIENT — пауза |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | GPS-подсказка, короткий сигнал | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — приглушение |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Голосовой поиск, запись | AUDIOFOCUS_LOSS — полная остановка |
Duck — это временное снижение громкости основного плеера до 20–30% на время звучания второстепенного звука. Android предоставляет API для ручного duck через AudioManager.adjustSuggestedStreamVolume, но большинство плееров реализуют приглушение собственными средствами. По данным Android Documentation (2026), duck-обработка должна длиться не более 3 секунд, после чего громкость восстанавливается.
Для правильной реализации Audio Focus необходимо последовательно выполнить три шага: создать запрос, запросить фокус перед воспроизведением и обработать событие в колбэке. Использование AudioFocusRequestCompat из AndroidX media обеспечивает совместимость со всеми версиями 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()
}
Запрос фокуса должен выполняться перед началом воспроизведения каждый раз, когда пользователь нажимает Play. Если результат AUDIOFOCUS_REQUEST_GRANTED — начинайте играть. Если DENIED — покажите пользователю сообщение или отложите воспроизведение до получения фокуса.
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()
}
}
}
В колбэке важно различать AUDIOFOCUS_LOSS и AUDIOFOCUS_LOSS_TRANSIENT. В первом случае плеер НЕ должен возобновляться автоматически — пользователь явно запустил другое аудио. Во втором — можно автоматически возобновить при получении AUDIOFOCUS_GAIN. Флаг wasPlayingBeforeLoss помогает запомнить, нужно ли восстанавливать воспроизведение.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
Вызов abandonAudioFocusRequest сообщает системе, что приложение больше не нуждается в фокусе. Это важно вызывать при паузе и остановке плеера. Если не освободить фокус, другое приложение, запросив AUDIOFOCUS_GAIN, не получит LOSS и звуки будут накладываться.
Корректная обработка потери фокуса — ключевое требование для прохождения ревью в Google Play. Неправильная обработка ведёт к негативным отзывам: пользователи жалуются, что музыка продолжает играть во время звонка или поверх навигации.
При получении AUDIOFOCUS_LOSS плеер должен остановиться и не возобновляться до явного нажатия Play. При AUDIOFOCUS_LOSS_TRANSIENT (звонок, уведомление) плеер приостанавливается и возобновляется автоматически при восстановлении фокуса. При AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK плеер временно снижает громкость до 20–30% на время звучания внешнего аудио.
По данным Android Developer Guide (2026), duck должен быть реализован через умножение текущего уровня громкости AudioTrack на коэффициент 0.2–0.3. Не используйте AudioManager.setStreamVolume — это меняет системную громкость и влияет на другие приложения. Duck выполняется только на стороне своего плеера.
При входящем звонке система автоматически запрашивает AUDIOFOCUS_GAIN_TRANSIENT через приложение Телефон. Плеер получает AUDIOFOCUS_LOSS_TRANSIENT и приостанавливается. После завершения звонка или если пользователь сбросил вызов, фокус возвращается — плеер автоматически возобновляет воспроизведение, если это музыкальный плеер.
Для навигационных приложений (Google Maps) используется AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK при голосовых подсказках. Плеер приглушается на 2–3 секунды, затем громкость восстанавливается. Если пользователь слушает подкаст, а не музыку, вместо duck лучше ставить на паузу — в подкастах важна каждая секунда.
На практике разработчики сталкиваются с несколькими стандартными сценариями, в которых Audio Focus ведёт себя по-разному. Рассмотрим типовые случаи и правильные реакции на них.
Важно реализовать флаг, который запоминает, играла ли музыка до потери фокуса. Если пользователь сам нажал паузу, а потом пришёл звонок — возобновлять не нужно. Флаг сбрасывается при явной паузе пользователя и устанавливается при старте воспроизведения.
По данным UX-исследований Google (2024), автоматическое возобновление после звонка повышает удовлетворённость пользователей на 22%. Но если плеер возобновился после того, как пользователь уже начал смотреть видео — это вызывает раздражение. Флаг wasPlayingBeforeLoss защищает от ложных возобновлений.
Часто задаваемые вопросы
Да, начиная с Android 12, Google Play рекомендует реализацию Audio Focus для всех приложений, воспроизводящих аудио. Приложения Music & Audio категории обязаны его реализовать для публикации. Игнорирование может привести к отклонению обновления.
Запустите плеер, затем откройте другое приложение с аудио (например, YouTube Music). Ваш плеер должен приостановиться. Затем закройте YouTube Music — плеер должен автоматически возобновиться. Для duck-теста используйте Google Maps с голосовыми подсказками.
Система сообщает: «Другому приложению нужно ненадолго воспроизвести короткий звук — приглуши свой плеер». Это оптимально для голосовых подсказок и коротких уведомлений. Громкость восстанавливается после завершения чужого аудио без ручного вмешательства.
Формально да — система не принуждает. Но на практике это означает наложение звуков. Пользователь услышит одновременно музыку и звонок, что ведёт к негативному опыту. Google рекомендует всегда обрабатывать AUDIOFOCUS_LOSS остановкой плеера.
На iOS аналогичную роль выполняет Audio Session, которая управляется через AVAudioSession. Механизмы похожи: категории и опции определяют поведение при наложении звуков. Однако API и правила кардинально отличаются — каждый фреймворк реализован по-своему.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также