Потоки и аудиоатрибуты в автомобильной ОС
Мы пытаемся адаптировать наше приложение-навигатор для Android Automotive OS и видим, что если мы используем STREAM_MUSIC
для уведомлений навигатора то не смешивается с FM-радио. Если мы используемSTREAM_NOTIFICATION
тогда navi действительно смешивается с FM-радио, но в настройках Android Car изменить STREAM_NOTIFICATION
объем. Правильно ли мы понимаем, что потоки не сопоставляются с AudioAttributes в автомобильной ОС автоматически, и все приложения навигатора должны быть перемещены вUSAGE_ASSISTANCE_NAVIGATION_GUIDANCE
правильно работать на автомобильной ОС?
1 ответ
В приложении следует использовать атрибуты аудио использования и содержимого вместо устаревших типов потоков.
Типы потоков, такие как STREAM_MUSIC
, STREAM_NOTIFICATION
и т. д. заменяются AudioAttributes для определения поведения воспроизведения звука, и большая часть потокового API уже устарела - одним исключением в обычном Android является регулировка громкости (см. AudioManager и такие методы, какsetStreamVolume
, adjustStreamVolume
, так далее.).
Но в реализациях Android Automotive Android Framework настроен на использование политики фиксированного объема, что означает отсутствие управления громкостью на основе потоков. Ожидается, что фактическое управление громкостью будет реализовано с помощью Audio HAL или аппаратного усилителя (см. Документацию Android Automotive Audio), и для такого случая существует отдельный API управления громкостью, основанный на группах громкости в CarAudioManager.
Также помните, что перед запуском аудиопотока приложение должно запросить аудиофокус, используя те же атрибуты аудио, что и для своего аудиопотока.
Упрощенный пример:
AudioAttributes playbackAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
MediaPlayer player = new MediaPlayer();
player.setDataSource( /* ... */);
player.setAudioAttributes(playbackAttributes);
player.prepare();
AudioFocusRequest focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(playbackAttributes)
.setOnAudioFocusChangeListener( /* ... */)
.build();
int result = mAudioManager.requestAudioFocus(focusRequest);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
// Respect audio focus
player.start();
}