Использование гарнитуры Bluetooth в качестве микрофона и динамика в приложении голосового чата - PullRequest
0 голосов
/ 12 марта 2019

У меня есть приложение для голосового чата, которое отлично работает. В настоящее время я пытаюсь сделать так, чтобы приложение поддерживало bluetooth-гарнитуры, если какая-либо из них была подключена. Мне нужно разобраться с двумя случаями:

  1. Bluetooth-гарнитура подключена до начала вызова.
  2. Bluetooth-гарнитура подключается к устройству во время разговора.

В первом случае приложение должно автоматически начать использовать гарнитуру в качестве аудиоустройства ввода / вывода по умолчанию. С другой стороны, приложение при подключении гарнитуры к устройству должно переключаться с текущего аудиоустройства ввода / вывода на гарнитуру Bluetooth.

Мне удалось успешно обработать первый случай, используя следующий код:

mAudioManager.setMode(0);
mAudioManager.startBluetoothSco();
mAudioManager.setBluetoothScoOn(true);
mAudioManager.setMode(android.media.AudioManager.MODE_IN_CALL);

Что касается второго случая, я создал BroadcastReciever, который прослушивает, когда Bluetooth-гарнитура подключена, следующим образом:

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);
        }
    }
};

BroadcastReciever был в состоянии обнаружить соединения / разъединения гарнитуры, и звонок направлял звук на гарнитуру, а не на динамик телефона. Проблема заключается в том, что приложение продолжает использовать микрофон устройства в качестве входного аудиоустройства, а не гарнитуру гарнитуры . После очень долгого осмотра я понял, что когда BroadcastReciever получает уведомление о подключении гарнитуры, мне нужно немного подождать, прежде чем позвонить mAudioManager.startBluetoothSco();, чтобы приложение использовало микрофон гарнитуры. ,

Вопрос в том, какое событие я должен слушать после того, как узнаю, что Bluetooth-гарнитура подключена, чтобы я мог начать захватывать голос с микрофона гарнитуры?

1 Ответ

0 голосов
/ 12 марта 2019

Оказывается, я не должен слушать BluetoothDevice.ACTION_ACL_CONNECTED, скорее, я должен рассмотреть BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED. BroadcastReciever должен быть инициализирован следующим образом:

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);
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...