做车机的开发人员知道,项目中一定会遇到处理声音的逻辑,例如,开车在听音乐,同时又在导航路线,播放音乐时,导航要报前面左转或有车速拍照等导航音,那么就需要对声音的大小进行处理,导航音开始播报时要先将音乐音量变小,导航音播报完了之后还得自动恢复音乐的音量,那么有人问了,你怎么知道导航软件要开始播放了,什么时候播报完了呢?因为我们公司跟高德地图有合作,有了一款定制的高德导航软件apk,它开始播放和播报完成时都会发送一个广播,我们在Framework层收到广播时进行处理的,核心思路就是开始获取当前音量保存下来,等到播报结束之后再设置回去,其实声音处理的逻辑很复杂的;如果没有合作,那么得自己去抓导航音走的什么api,可能走的是AudioTrack的write()方法,下面是声音通道的api,供大家参考:
在安卓设备中有几种声音,在AudioManager.java类中分别被定义为STREAM_VOICE_CALL(通话声音),STREAM_SYSTEM(系统声音),STREAM_RING(响铃声音),STREAM_MUSIC(媒体声音),STREAM_ALARM(闹铃),STREAM_NOTIFICATION(顶部状态栏弹出消息)等这几个streamType,调节声音的话有两种方式,但是必须先获得AudioManager对象(getSystemService(Context.AUDIO_SERVICE)),第一种方式是渐进式的:am.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); 第二种方式是直接设置音量值的:am.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);第二个参数是音量值大小,第三个参数为0时代表什么都没有;获得音量值使用am.getStreamVolume(AudioManager.STREAM_MUSIC)(获取当前音量值),am.getStreamMaxVolume(AudioManager.STREAM_MUSIC)(获取音量的最大值)