Android 在语音聊天应用程序中将蓝牙耳机用作麦克风和扬声器

Android 在语音聊天应用程序中将蓝牙耳机用作麦克风和扬声器,android,bluetooth,voip,Android,Bluetooth,Voip,我有一个语音聊天应用程序,它工作得很好。目前,我正在尝试使应用程序支持蓝牙耳机,以防任何连接。我需要处理两种情况: 蓝牙耳机在通话开始前已连接 蓝牙耳机在通话过程中连接到设备 对于第一种情况,应用程序应自动开始使用耳机作为默认的输入/输出音频设备。另一方面,当耳机连接到设备时,应用程序应该从当前的输入/输出音频设备切换到蓝牙耳机 我使用以下代码成功地处理了第一个案例: mAudioManager.setMode(0); mAudioManager.startBluetoothSco(); mAu

我有一个语音聊天应用程序,它工作得很好。目前,我正在尝试使应用程序支持蓝牙耳机,以防任何连接。我需要处理两种情况:

  • 蓝牙耳机在通话开始前已连接
  • 蓝牙耳机在通话过程中连接到设备
  • 对于第一种情况,应用程序应自动开始使用耳机作为默认的输入/输出音频设备。另一方面,当耳机连接到设备时,应用程序应该从当前的输入/输出音频设备切换到蓝牙耳机

    我使用以下代码成功地处理了第一个案例:

    mAudioManager.setMode(0);
    mAudioManager.startBluetoothSco();
    mAudioManager.setBluetoothScoOn(true);
    mAudioManager.setMode(android.media.AudioManager.MODE_IN_CALL);
    
    至于第二种情况,我创建了一个
    广播接收器
    ,它在蓝牙耳机连接时监听,如下所示:

    mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
                mAudioManager.setMode(0);
                mAudioManager.startBluetoothSco();
                mAudioManager.setBluetoothScoOn(true);
                mAudioManager.setMode(android.media.AudioManager.MODE_IN_CALL);
            } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
                mAudioManager.setMode(0);
                mAudioManager.startBluetoothSco();
                mAudioManager.setBluetoothScoOn(false);
                mAudioManager.setMode(android.media.AudioManager.MODE_IN_CALL);
            }
        }
    };
    
    mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
    
            if (BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
                int state = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, -1);
                boolean result = state == BluetoothHeadset.STATE_CONNECTED;
                mCallback.onConnected(result);
            }
        }
    };
    
    broadcastReceiver
    能够检测到耳机连接/断开,并且通话将声音定向到耳机,而不是手机的听筒问题在于,应用程序一直使用设备的麦克风作为输入音频设备,而不是耳机的。经过长时间的检查,我意识到当
    广播接收器
    收到耳机已连接的通知时,我需要稍等片刻,然后再调用
    mAudioManager.startBluetoothSco()以使应用程序使用耳机的麦克风


    问题是,在知道蓝牙耳机已连接后,我应该收听什么样的事件,以便开始从耳机的麦克风捕获声音?

    结果是我不应该收听
    蓝牙设备。操作\u ACL\u已连接
    ,而我应该考虑的是<代码> BuLotoOutHead。ActhnOnCalpNo.StAtEyx更改。
    广播接收器
    应按如下方式初始化:

    mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
                mAudioManager.setMode(0);
                mAudioManager.startBluetoothSco();
                mAudioManager.setBluetoothScoOn(true);
                mAudioManager.setMode(android.media.AudioManager.MODE_IN_CALL);
            } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
                mAudioManager.setMode(0);
                mAudioManager.startBluetoothSco();
                mAudioManager.setBluetoothScoOn(false);
                mAudioManager.setMode(android.media.AudioManager.MODE_IN_CALL);
            }
        }
    };
    
    mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
    
            if (BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
                int state = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, -1);
                boolean result = state == BluetoothHeadset.STATE_CONNECTED;
                mCallback.onConnected(result);
            }
        }
    };