android播放语音,切换听筒模式遇到的问题
2016年09月18日 15:14:40 Jessehuyang 阅读数:4943 标签: android
在android5.0以上我们设置听筒模式audioManager.setMode(AudioManager.MODE_IN_CALL)没有效果;后来各种查阅资料,发现android5.0以上Google官方文档推荐使用
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
直接上切换代码:
/**
* 设置语音播放的模式
* @param ctx
* @param mode
*/
public void setAudioMode(Context ctx, int mode) {
if (mode != AudioManager.MODE_NORMAL && mode != AudioManager.MODE_IN_COMMUNICATION) {
return;
}
AudioManager audioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);
if (mode == AudioManager.MODE_NORMAL) {
audioManager.setSpeakerphoneOn(true);//打开扬声器
} else if (mode == AudioManager.MODE_IN_COMMUNICATION) {
audioManager.setSpeakerphoneOn(false);//关闭扬声器
}
audioManager.setMode(mode);
}
做到这一步,如果此时还是没有解决问题:
那就是在播放模式没有设置正确:
在这里我使用的是AudioTask播放语音,初始化AudioTask设置如下:
int sampleRate = readInt(packet, offset + 36);//比特率
int minBufferSize = AudioTrack.getMinBufferSize(sampleRate,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);//缓冲大小
AudioTrack track = new AudioTrack(AudioManager.STREAM_VOICE_CALL, sampleRate,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
minBufferSize, AudioTrack.MODE_STREAM);
我之前一直设置的是AudioManager.STREAM_MUSIC,找这个问题找了一天后来找到,知道看到下面这个网站,才找到答案
下面是链接:
[这里写链接内容](http://stackoverflow.com/questions/6577646/what-is-audio-focus-in-android-class-audiomanager?rq=1)
- 1
写到这里就结束了,稍微扩展下,
像很多音乐播放器,插入耳机时会使用耳机播放,当我们拔出而且得时候,会暂停,或者别的操作如何实现咧?
其实很简单,当耳机插入或者链接蓝牙耳机,系统已经默认处理插入耳机切换模式的操作,此时我们需要处理就是拔出耳机的处理
监听耳机状态首先想到广播:而系统也为我们提供相应的广播,我们只需要监听耳机变化广播就可以了
代码如下:
- state — 0代表拔出,1代表插入
- name— 字符串,代表headset的类型。
-
microphone – 1代表这个headset有麦克风,0则没有。
BroadcastReceiver mHeadSetReceiver = new BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {// TODO Auto-generated method stub if(intent.hasExtra("state")){ if(intent.getIntExtra("state", 0)==0){ Toast.makeText(context, "headset not connected", Toast.LENGTH_LONG).show(); } else if(intent.getIntExtra("state", 0)==1){ Toast.makeText(context, "headset connected", Toast.LENGTH_LONG).show(); } }
}
注意:这个广播必须是在代码里面注册Receiver才有效,在xml中添加intentfilter没效。