Потоки и аудиоатрибуты в автомобильной ОС

Мы пытаемся адаптировать наше приложение-навигатор для 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();
}
Другие вопросы по тегам