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代表插入
  2. name— 字符串,代表headset的类型。
  3. 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没效。

你可能感兴趣的:(android播放语音,切换听筒模式遇到的问题)