汽车操作系统上的流和音频属性

时间:2019-10-25 16:02:17

标签: android-automotive

我们尝试使导航器应用程序适应Android Automotive操作系统,并且看到如果将STREAM_MUSIC用于导航器通知,则它不会与FM收音机混合使用。 如果我们使用STREAM_NOTIFICATION,那么navi确实会与FM广播混合使用,但是Android Car Settings中无法更改STREAM_NOTIFICATION的音量。 我们是否正确理解流不会自动映射到Automotive OS中的AudioAttributes,并且所有导航器应用程序都必须移至USAGE_ASSISTANCE_NAVIGATION_GUIDANCE才能在Automotive OS上正常运行?

1 个答案:

答案 0 :(得分:1)

您应在应用程序中使用使用情况和内容音频属性,而不是传统流类型。

AudioAttributes取代了STREAM_MUSICSTREAM_NOTIFICATION等流类型,以定义音频播放的行为,并且大多数基于流的API已被弃用-其中一个例外常规的Android是音量控制(请参考AudioManager和诸如setStreamVolumeadjustStreamVolume之类的方法。)

但是在Android Automotive实现中,Android Framework配置为使用固定的音量策略,这意味着也没有基于流的音量控制。预计实际的音量控制将通过Audio HAL或硬件放大器(请参阅Android Automotive Audio文档)来实现,在这种情况下,将基于CarAudioManager中的音量组使用单独的音量控制API。

请记住,在开始音频流之前,应用程序应该使用与音频流相同的音频属性来请求音频聚焦。

简化示例:

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();
}