Перед запуском логического потока приложение запрашивает фокус на аудиопотоке, используя те же атрибуты аудио, что и для логического потока. Приложение должно учитывать потери фокуса, чтобы работать должным образом в автомобильных сценариях использования.
Хотя отправка запроса на фокусировку рекомендуется, система не обязывает к этому. Поэтому рассматривайте фокусировку как средство косвенного управления и предотвращения конфликтов во время воспроизведения, а не как основной механизм управления звуком. Автомобиль не должен зависеть от системы фокусировки для работы аудиоподсистемы.
Фокусированные взаимодействия
Для поддержки AAOS запросы на выделение аудиофокуса обрабатываются на основе предопределенных взаимодействий между CarAudioContext запроса и контекстом текущих пользователей, занимающих фокус. Существует три типа взаимодействий:
- Эксклюзив
- Отклонять
- Одновременно
Эксклюзивное взаимодействие
Это наиболее распространенная модель взаимодействия с Android.
В режиме эксклюзивного взаимодействия одновременно может удерживать фокус только одно приложение. Поэтому входящий запрос на фокус получает фокус, в то время как существующее приложение теряет фокус. Поскольку оба приложения воспроизводят медиафайлы, фокус может удерживать только одно приложение. В результате запрос на фокус от вновь запущенного приложения возвращается с кодом AUDIOFOCUS_REQUEST_GRANTED а текущее приложение, воспроизводящее музыку, получает событие смены фокуса со статусом потери, соответствующим типу сделанного запроса.
Отклонить взаимодействие
При отклонении запроса входящий запрос всегда отклоняется. Например, при попытке воспроизвести музыку во время разговора. В этом случае, если приложение «Набор номера» удерживает аудиофокус для разговора, а второе приложение запрашивает фокус для воспроизведения музыки, музыкальное приложение получает в ответ на запрос сообщение AUDIOFOCUS_REQUEST_FAILED . Поскольку запрос на фокус отклонен, потеря фокуса не отправляется текущему владельцу фокуса.
Одновременное взаимодействие
Уникальной особенностью AAOS являются одновременные взаимодействия. Это позволяет приложениям, запрашивающим фокус на воспроизведение звука в автомобиле, удерживать фокус одновременно с другими приложениями. Для того чтобы произошло одновременное взаимодействие, должны быть выполнены следующие условия:
Входящий запрос на фокусировку должен запрашивать AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
Владелец текущего фокуса не устанавливает параметр `setPauseWhenDucked(true)`.
Текущий владелец фокуса решил не принимать предложения по мероприятиям, связанным с утками.
Если эти критерии соблюдены, запрос на фокусировку возвращается с кодом AUDIOFOCUS_REQUEST_GRANTED при этом текущий обладатель фокуса не меняет своего положения. Однако, если текущий обладатель фокуса решает получать события приглушения звука или приостанавливать воспроизведение приглушения, он теряет фокус, как это происходит при эксклюзивном взаимодействии.
Обработка одновременных потоков
Несмотря на многочисленные возможности одновременного взаимодействия, следует проявлять осторожность при смешивании и подавлении звука на аппаратном уровне на разных устройствах вывода. Мы настоятельно рекомендуем направлять экземпляры CarAudioContext , которым разрешено одновременное воспроизведение, на разные устройства вывода.
Использование отдельных устройств вывода для одновременно воспроизводимых потоков позволяет HAL приглушать один из потоков перед их сведением или направлять физические потоки на разные динамики в автомобиле. Если логические потоки смешиваются внутри Android, усиление остается неизменным и передается как часть одного и того же физического потока.
Например, при одновременной передаче навигационной информации и мультимедиа усиление медиапотока можно временно уменьшить (или приглушить), чтобы навигационные инструкции были слышны чётче. В качестве альтернативы, навигационный поток можно направить на динамики со стороны водителя, в то время как воспроизведение мультимедиа продолжится в остальной части салона.
Матрица взаимодействия
В этой таблице представлена матрица взаимодействия, определенная CarAudioService . Каждая строка представляет собой CarAudioContext текущего пользователя, а каждый столбец — контекст входящего запроса.
Например, когда приложение для воспроизведения музыки удерживает фокус, а приложение для навигации запрашивает фокус, матрица указывает, что оба взаимодействия могут воспроизводиться одновременно, при условии выполнения других критериев для одновременного взаимодействия .
Из-за одновременного взаимодействия может быть более одного держателя фокуса. В этом случае входящий запрос на фокус сравнивается с каждым из текущих держателей фокуса, прежде чем определить, какое взаимодействие применить. В этом случае побеждает наиболее консервативное взаимодействие. Отклонить, затем исключить, и наконец, применить одновременное взаимодействие.
Рисунок 1. Матрица взаимодействия фокуса звука.
Навигация во время телефонных звонков
В Android 11 была введена новая пользовательская настройка, позволяющая изменять поведение взаимодействия между навигацией и телефонными звонками. При установке параметра android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL взаимодействие между входящими запросами на фокусировку NAVIGATION и текущими держателями фокуса CALL изменяется с одновременного на отклонение . Если пользователь предпочитает, чтобы инструкции навигации не прерывали звонок, он может включить эту настройку. Это значение сохраняется для пользователя и может быть установлено динамически, чтобы последующие запросы на фокусировку учитывали новую настройку.
Задерживаемая фокусировка звука
В Android 11 AAOS добавила поддержку запроса на отложенный аудиофокус. Это позволяет откладывать запросы на фокус, не требующие временного изменения, когда их взаимодействие с текущими держателями фокуса обычно приводит к их отклонению. Как только изменение фокуса приводит к состоянию, в котором отложенный запрос может получить фокус, запрос удовлетворяется.
Правила обработки запросов на отложенную фокусировку звука
Только для запросов, не связанных с временными изменениями. Запрос с задержкой может быть отправлен только для источников, не связанных с временными изменениями, чтобы избежать воспроизведения временного звука спустя долгое время после того, как он станет актуальным.
Одновременно можно отложить только один запрос. Если запрос с возможностью отсрочки поступает, когда уже существует отложенный запрос, исходный отложенный запрос получает событие изменения
AUDIOFOCUS_LOSS, а новый запрос получает синхронный ответAUDIOFOCUS_REQUEST_DELAYED.Для отложенных запросов необходимо использовать
OnAudioFocusChangeListener. После задержки запроса слушатель используется для уведомления отправителя запроса о том, когда запрос в конечном итоге будет удовлетворен (AUDIOFOCUS_GAIN), или если он будет отклонен позже (AUDIOFOCUS_LOSS).
Запрос на отложенное фокусирование
Чтобы сформировать запрос, который можно отложить:
Используйте
AudioFocusRequest.Builder#setAcceptsDelayedFocusGain.mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener(); mDelayedFocusRequest = new AudioFocusRequest .Builder(AudioManager.AUDIOFOCUS_GAIN) .setAudioAttributes(mMusicAudioAttrib) .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener) .setForceDucking(false) .setWillPauseWhenDucked(false) .setAcceptsDelayedFocusGain(true) .build();При отправке запроса обработайте ответ
AUDIOFOCUS_REQUEST_DELAYED:int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest); if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // start audio playback return; } if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) { // audio playback delayed to audio focus listener return; }При задержке запроса обработчик изменения фокуса обрабатывает изменения фокуса:
private final class MediaWithDelayedFocusListener implements OnAudioFocusChangeListener { @Override public void onAudioFocusChange(int focusChange) { synchronized (mLock) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: … // Start focus playback case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: … // Pause media transiently case AudioManager.AUDIOFOCUS_LOSS: … // Stop media
Системное принудительное затухание
В Android 15 в AAOS реализовано принудительное затухание звука, обеспечиваемое системой. В Android система не контролирует сохранение фокуса на звуке. Поэтому, хотя разработчикам приложений рекомендуется соблюдать рекомендации по сохранению фокуса на звуке, если приложение продолжает воспроизводить громкий звук даже после потери фокуса, система не может это предотвратить.
В условиях, критически важных для безопасности автомобилей, соблюдение фокуса на звуке имеет решающее значение для минимизации отвлечения водителя. Благодаря этой функции аудиосистема теперь автоматически приглушает звук приложений, которые теряют фокус, обеспечивая более контролируемое и предсказуемое звучание.
Это усовершенствование помогает гарантировать, что приложения будут следовать решению о потере фокуса звука, определенному матрицей взаимодействия , предотвращая конфликты при воспроизведении звука.
Проектирование высокого уровня
На следующем рисунке показана высокоуровневая архитектура и поддержка функции потери фокусировки в автомобилях:

Рисунок 2. Высокоуровневая схема функции затухания сигнала, обеспечиваемой системой.
- Целенаправленное затухание: В Android 15 функция принудительного затухания звука специально разработана для ситуаций, когда приложение теряет фокус на воспроизведении звука, но продолжает его воспроизводить.
- Механизм затухания: Когда приложение теряет фокус на воспроизведение звука в пользу нового приложения, запросившего звук:
- Аудиосистема автоматически затухает звук неработающего приложения.
- После затухания звука система отключает аудиопоток.
- Затем приложение получает уведомление о потере фокуса звука.
- Некорректно работающие приложения отключаются до тех пор, пока не восстановят контроль над звуком.
- По умолчанию приложения, которые были затемнены через 2 секунды, появляются плавно. Однако производители оборудования могут настроить это значение на любой другой таймаут.
- Аудиосистема использует конфигурации OEM как для плавного затухания, так и для плавного нарастания звука.
Файл конфигурации OEM: Android 15 включает новый файл конфигурации
car_audio_fade_configuration.xml:- Этот файл позволяет производителям оборудования определять критерии, при которых принудительное применение фокуса на звуке в системе применяется к приложению, у которого возникли проблемы.
- Аудиофреймворк обеспечивает затухание и отключение звука только в том случае, если приложение, вызвавшее ошибку, соответствует правилам, определенным производителем оборудования в этом XML-файле.
- Это предоставляет производителям оборудования механизм для настройки поведения функции в зависимости от характеристик приложения или типов использования звука.
Управление функциями с помощью RRO: Введен новый флаг функции наложения ресурсов во время выполнения (RRO),
audioUseFadeManagerConfiguration, позволяющий включать или отключать эту функцию:- Эта функция отключена по умолчанию.
- Для активации принудительной потери фокуса звука производителем оборудования необходимо установить этот флаг в
true. - Хотя платформа Car Audio Framework ожидает корректных определений конфигурации затухания, если этот флаг включен, отсутствие таких определений не приводит автоматически к фатальной ошибке.
- Все приложения с настройками затухания должны иметь соответствующие определения затухания. Указание конфигурации затухания (по её названию) в настройках автомобильной аудиосистемы без предоставления корректного определения является критической ошибкой.
- Если этот флаг отключен, все определения конфигурации затухания и любые ссылки на конфигурацию игнорируются.
Настройка менеджера затухания
Аудиофреймворк Android 15 представляет собой унифицированный FadeManagerConfiguration , предоставляющий производителям оборудования детальный контроль над поведением затухания звука. Этот фреймворк показан на рисунке 3:

Рисунок 3. Конфигурация менеджера затухания.
Данная конфигурация включает в себя:
- Свойства перехода «Затухание»: настройки для затухания и появления.
- Может быть определено с учетом конкретных вариантов использования звука или его характеристик.
- Позволяет устанавливать пользовательские параметры продолжительности.
- Эти параметры используются для создания объекта
VolumeShaper.Configuration.
- Политика постепенного прекращения действия правил: Правила, регулирующие случаи прекращения действия правил.
- Глобальный переключатель для включения или выключения эффекта затухания.
- Настраиваемый список вариантов использования звука с возможностью плавного затухания (звук может затухать при потере фокуса).
- Списки исключений (с возможностью автоматического отключения) предотвращают автоматическое отключение важных или определенных источников звука. Эти списки могут быть основаны на следующих критериях:
- Типы контента
- Аудиоатрибуты
- Идентификаторы приложений (могут быть установлены только во время выполнения).
OEM-конфигурации
В этом разделе мы рассмотрим доступные варианты индивидуальной настройки от производителя оборудования (OEM).
XML-файл конфигурации регулировки затухания звука в автомобиле
В Android 15 представлен новый конфигурационный файл car_audio_fade_configuration.xml , позволяющий производителям оборудования вносить существенные изменения в поведение затухания звука при потере фокуса.
- Этот XML-файл позволяет определить несколько различных конфигураций затухания, каждая из которых требует уникального имени для перекрестных ссылок в файле
car_audio_configuration.xml. - Эти настройки могут гибко применяться к различным аудиозонам и конфигурациям зон.
- Примечательно, что каждая конфигурация затухания принимает только значения длительности в миллисекундах, которые система затем использует для внутренней генерации соответствующего объекта
VolumeShaper.Configuration.
Для получения практических рекомендаций по внедрению обратитесь к примерам конфигураций эмулятора, расположенным по адресу device/generic/car/emulator/audio/car_audio_fade_configuration.xml .
XML-файл конфигурации автомобильной аудиосистемы
В Android 15 представлен обновленный файл car_audio_configuration.xml , теперь версии 4, который включает новые теги applyFadeConfigs и fadeConfig . Тег applyFadeConfigs может содержать несколько определений fadeConfig , что позволяет гибко настраивать затухание звука. Каждое определение:
- Необходимо указать один
fadeConfigпо умолчанию, заданный значениемisDefault = true. - Может включать несколько временных определений
fadeConfig. Эти временные конфигурации применяются специально во время взаимодействия при потере фокуса звука и только тогда, когда приложение, восстанавливающее фокус звука, соответствует критериям, определенным во временной конфигурации.
Для получения практических рекомендаций по внедрению обратитесь к примерам конфигураций эмулятора, расположенным по адресу device/generic/car/emulator/audio/car_audio_configuration.xml .
Расширение сервисной поддержки OEM-аудиосистемы
Производители автомобилей, внедряющие собственную службу фокусировки автомобильной аудиосистемы, имеют возможность настраивать параметры затухания звука, включая их в объект OemCarAudioFocusResult . Этого можно добиться с помощью метода setAudioAttributesToCarAudioFadeConfigurationMap() :
/** @see OemCarAudioFocusResult#getAudioAttributesToCarAudioFadeConfigurationMap() **/
@NonNull
public Builder setAudioAttributesToCarAudioFadeConfigurationMap(@NonNull
Map<AudioAttributes, CarAudioFadeConfiguration> attrsToCarAudioFadeConfig) {
}
Следует отметить, что производители оборудования могут выбирать между использованием предварительно настроенных параметров затухания звука при загрузке или динамическим применением конфигураций через собственную службу настройки фокусировки звука, что обеспечивает гибкую систему управления.
Диаграмма последовательности
Данная последовательность действий иллюстрирует поведение App2 после предоставления ему аудиофокуса и последующую потерю аудиофокуса приложением App1 :
- После того, как служба автомобильной аудиосистемы отправляет сообщение о потере фокуса звука в
App1, воспроизведение из проигрывателяApp1прерывается с затуханием в соответствии с активными параметрамиFadeManagerConfiguration. После завершения операции затуханияApp1получает стандартный обратный вызов о потере фокуса звука. - При желании, звук для
App1может плавно вернуться в воспроизведение через настраиваемый промежуток времени. Производители оборудования могут гибко устанавливать эту продолжительность с помощьюBuilder#setFadeInDurationForUsage(int, long)в соответствии со своими конкретными требованиями к продукту.

Рисунок 4. Схема последовательности работы функции затухания звука в автомобиле.
Многозонное управление фокусировкой
В автомобилях с многозонной аудиосистемой управление фокусировкой звука осуществляется независимо для каждой зоны. Таким образом, запрос к одной зоне не учитывает фокусировку в других зонах и не приводит к потере фокуса в зонах, где фокусировка уже установлена. Благодаря этому, фокусировка в салоне может управляться отдельно от развлекательной системы для задних пассажиров, что предотвращает прерывание воспроизведения звука в одной зоне из-за изменений фокусировки на другой.
Для всех приложений CarAudioService автоматически управляет фокусировкой. Аудиозона запроса на фокусировку определяется связанным с ним UserId ) или UID (подробнее см. раздел «Многозонная маршрутизация звука »).
Запросить аудиосигнал из нескольких зон одновременно
Если приложение хочет воспроизводить звук одновременно в нескольких зонах, оно должно запросить фокус для каждой зоны, включив AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID в пакет:
//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
zoneId);
AudioAttributes attributesWithZone = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.addBundle(bundle)
.build();
//Create focus request using built attributesWithZone
Этот параметр пакета позволяет запрашивающей стороне переопределить автоматическое сопоставление аудиозон и использовать вместо этого указанный идентификатор зоны. Таким образом, приложение может отправлять отдельные запросы для разных аудиозон.
HAL аудиофокус
Начиная с Android 11, HAL позволяет запрашивать фокус от имени внешних потоков. Хотя это и необязательно, использование этих API настоятельно рекомендуется для оптимальной интеграции внешних звуков в экосистему Android и обеспечения бесперебойной работы пользователя.
HAL принимает окончательное решение о том, каким звукам следует отдавать приоритет. В этом отношении аварийные и критически важные для безопасности звуки должны воспроизводиться независимо от того, предоставлен ли HAL звуковой фокус, и должны продолжать воспроизводиться по мере необходимости, даже если HAL потеряет звуковой фокус. То же самое относится и к любым звукам, требуемым государственными нормативными актами.
HAL должен заблаговременно отключать звуковые потоки Android при воспроизведении аварийных или критически важных для безопасности звуков, чтобы обеспечить их четкую слышимость.
AudioControl@2.0
В версии 2.0 AudioControl HAL представлены следующие новые API:
| API | Цель |
|---|---|
IAudioControl#registerFocusListener | Регистрирует экземпляр IFocusListener в AudioControl HAL. Этот слушатель позволяет HAL запрашивать и отменять фокусировку звука. HAL предоставляет экземпляр ICloseHandle , который Android использует для отмены регистрации слушателя. |
IAudioControl#onAudioFocusChange | Уведомляет HAL об изменениях статуса запросов на фокусировку, поступающих от HAL через IFocusListener , включая ответы на первоначальные запросы на фокусировку. |
IFocusListener#requestAudioFocus | Запрашивает фокусировку от имени HAL для указанного использования, идентификатора зоны и типа усиления фокуса. |
IFocusListener#abandonAudioFocus | Отменяет существующие запросы на фокусировку HAL для указанного использования и идентификатора зоны. |
HAL может одновременно обрабатывать несколько запросов на фокусировку, но ограничен одним запросом на каждое использование и пару идентификаторов зон. Android предполагает, что HAL немедленно начинает воспроизводить звуки для использования после получения запроса и продолжает это делать до тех пор, пока не откажется от фокусировки.
Помимо registerFocusListener , эти запросы являются oneway способов гарантировать, что Android не будет задерживать HAL во время обработки запроса на фокусировку. HAL не должен ждать получения фокуса перед воспроизведением критически важных для безопасности звуков. Отслеживание и реагирование на изменения аудиофокуса через IAudioControl#onAudioFocusChange является необязательным.
Сервис по настройке автомобильной аудиосистемы OEM
В Android 14 AAOS представила сервисы автомобильных плагинов OEM, позволяющие настраивать некоторые компоненты автомобиля. Сервис Car Audio Plugin Service позволяет OEM-производителям управлять запросами на фокусировку, перехваченными сервисом автомобильной аудиосистемы. Это дает OEM-производителям большую гибкость в управлении фокусировкой в соответствии с правилами и нормами. Таким образом, взаимодействие с аудиофокусировкой может различаться у разных производителей и в разных регионах. Основной принцип работы аудиофокусировки остается в силе: приложения должны запрашивать фокусировку для более эффективного управления звуком и улучшения пользовательского опыта. В целом, для запросов на аудиофокусировку со стороны приложений по-прежнему действуют определенные правила:
При отсутствии постоянного, высокоприоритетного аудиофокуса (включая телефонный звонок, оповещение о чрезвычайной ситуации или уведомление о безопасности) приложения должны иметь возможность получать аудиофокус либо временно, либо постоянно.
В период активного внимания со стороны СМИ:
Приложения, запрашивающие фокус на использование вызова, должны иметь возможность принимать вызов либо одновременно, либо единолично.
Приложения, запрашивающие фокус на навигации, должны иметь возможность получать фокус на навигации либо одновременно, либо единолично.
Приложения, запрашивающие фокусировку на использовании голосового помощника, должны иметь возможность получать фокусировку либо одновременно, либо единолично.
В периоды, когда активны приложения с высоким приоритетом аудиосвязи (включая телефонный звонок, оповещение о чрезвычайной ситуации или уведомление о безопасности), любой входящий запрос на отложенную аудиосвязь должен быть удовлетворен или отложен по мере необходимости.
Хотя эти рекомендации не являются исчерпывающими, они могут помочь приложениям, запрашивающим фокус, получить его, если нет активных звуков с высоким приоритетом. Даже при наличии активных звуков с высоким приоритетом, отложенные запросы на фокус должны учитываться, и приложение должно иметь возможность получить фокус, когда звук с высоким приоритетом прекратится.