之前开发蓝牙app的时候遇到了一个问题,想让蓝牙麦克风实时地接收语音信号,但是发现蓝牙咪头始终不能传入声音信号,只有手机的麦克风能够传入声音信号,查阅了资料,发现是sco没有设置好。经过多尝试后解决了问题,这里分享给大家。
首先我使用了一个按键来设置打开或者关闭sco,即是用蓝牙麦克风输入还是用手机麦克风输入。
case R.id.button1:
if (btn1.getText().equals("手机")) {
//切换蓝牙
Log.i(TAG, "打开Sco....");
//获得蓝牙设备
Sco=true;
openSco();
btn1.setText(R.string.bluetooth);
}else{
// 关闭连接socket
// 切换手机
Sco=false;
closeSco();
btn1.setText(R.string.cellphone);
}
break;
然后是两个函数,openSco和closeSco
private void openSco(){
if (!mAudioManager.isBluetoothScoAvailableOffCall()) {
Log.d(TAG, "系统不支持蓝牙录音"");
return;
}
//mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
//蓝牙录音的关键,启动SCO连接,耳机话筒才起作用
mAudioManager.stopBluetoothSco();
mAudioManager.startBluetoothSco();
//蓝牙SCO连接建立需要时间,连接建立后会发出ACTION_SCO_AUDIO_STATE_CHANGED消息,通过接收该消息而进入后续逻辑。
//也有可能此时SCO已经建立,则不会收到上述消息,可以startBluetoothSco()前先
//stopBluetoothSco()
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {
mAudioManager.setBluetoothScoOn(true); //打开SCO
//voiceRecogniton();//开始语音识别
unregisterReceiver(this); //别遗漏
} else {//等待一秒后再尝试启动SCO
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mAudioManager.startBluetoothSco();
}
}
}, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED));
}
private void closeSco() {
if(mAudioManager.isBluetoothScoOn()){
mAudioManager.setBluetoothScoOn(false);
mAudioManager.stopBluetoothSco();
}
}
其中的audioManager
mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);