公司最近做的一个定制系统项目,其中有自己的app实现一个电话和录音功能。遇到几个坑,做个记录。
这设备只有单个喇叭接在扬声器通道上。平常使用是没问题的,但是当通话状态下,声音输出是从耳机出来的,所以
会没有声音,此时需要将声音输出切换到扬声器,并开启免提状态。要想达到此效果,需要将音频模式切换成IN_CALL,
只有在此状态audioManager.setSpeakerphoneOn(true)才能起效果。所以设置顺序不可以更改。
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);//需要先设置成MODE_IN_CALL,再切换speaker成免提才能起效果
当来电响铃时,音频模式并不需要切换,但是此时获得的audioManager.getMode(),有时会被系统切换成STREAM_RING,
这时就有可能没有声音,此时需要自己设置audioManager的音频mode为AudioManager.MODE_NORMAL。
当去电时,必须在对方响铃时就切换音频模式AudioManager.MODE_IN_CALL,并开启免提audioManager.setSpeakerphoneOn(true)。
以上总结一下,若是要保持声音一直从扬声器输出的话:
来电状态:
idle阶段:
audioManager.setMode(AudioManager.MODE_NORMAL); audioManager.setSpeakerphoneOn(false);
Ring阶段;
audioManager.setMode(AudioManager.MODE_NORMAL);
OFFHOOK阶段;
audioManager.setMode(AudioManager.MODE_IN_CALL); audioManager.setSpeakerphoneOn(true);//需要先设置成MODE_IN_CALL,再切换speaker成免提才能起效果
去电状态:
OFFHOOK和Ring阶段;
audioManager.setMode(AudioManager.MODE_IN_CALL); audioManager.setSpeakerphoneOn(true);//需要先设置成MODE_IN_CALL,再切换speaker成免提才能起效果
idle阶段:
audioManager.setMode(AudioManager.MODE_NORMAL); audioManager.setSpeakerphoneOn(false);