赞
踩
之前开发蓝牙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);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。