Android: 如何切换 SCO 链路。

最近在做蓝牙音箱开发,在 A2DP 和 HFP 来回切换的时候,遇到了手机兼容性的问题。最终发现设备收声和手机收声,是因为 soc 切换有问题。原先在网上找了一些资料发现其实还蛮简单的。就两句话,当时没想这么多就直接写了,发现还真能从设备收声,然后就没管了。然后客户反馈很多手机不能从设备收声,尤其是三星、华为最为严重。好吧,查了很多资料,同时跟嵌入式开发对代码。 SOC 都连接上了,还是不行。最终发现手机在切换的时候,需要设置 AudioManager 的模式:

  • MODE_NORMAL : 普通模式,既不是铃声模式也不是通话模式
  • MODE_RINGTONE : 铃声模式
  • MODE_IN_CALL : 通话模式
  • MODE_IN_COMMUNICATION : 通信模式,包括音/视频,VoIP通话.(3.0加入的,与通话模式类似)

1、开启 SCO 录音

public void startSCO() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            mAudioManager.setMode(AudioManager.MODE_IN_CALL);
        } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
        } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            mAudioManager.setMode(AudioManager.MODE_IN_CALL);
        }
        if (mAudioManager.isBluetoothScoOn()) {
            if (mAliRecorderManager != null) {
                if (!isStartRecord){
                    mAliRecorderManager.startTalk();
                }
            }
            return;
        }
        try {
            mAudioManager.setBluetoothScoOn(true);
            mAudioManager.startBluetoothSco();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
        BroadcastReceiver receiver = 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) {
                    if (mAliRecorderManager != null) {
                        if (!isStartRecord){
                            mAliRecorderManager.startTalk();
                        }
                    }
                    ca.unregisterReceiver(this);
                }
            }
        };
        ca.registerReceiver(receiver, intentFilter);
    }

2、关闭 SOC 录音

public void stopSCO() {
        mAudioManager.setMode(AudioManager.MODE_NORMAL);
        if (mAudioManager.isBluetoothScoOn()) {
            mAudioManager.setBluetoothScoOn(false);
            mAudioManager.stopBluetoothSco();
        }
    }
发布了48 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/jacksinrow/article/details/83344832