Прием звонка через гарнитуру Bluetooth VoIP

Я работаю над VoIP-Android-приложением, и приложение должно иметь возможность принимать / отклонять вызов с помощью гарнитуры Bluetooth.

Но проблема в том, что после добавления подключения к SCO

    audioManager.startBluetoothSco()
    audioManager.isBluetoothScoOn = true

Как только я нажимаю на кнопку гарнитуры, я слышу звук, который обычно появляется, когда я принимаю вызов с помощью телефонии, поэтому я предполагаю, что какой-то компонент системы Android ловит этот сигнал и не выбрасывает его

Что я уже пробовал:

1) Слушатель состояния телефонии (всегда бездействующий)

   val tm = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
   phoneStateListener = MyPhoneStateListener()
   tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE)

2) MediaSession + тихий шум + прослушиватель мультимедийных кнопок Не работает для первого клика, второй + клики обрабатываются правильно

3) MEDIA_BUTTON приемник не работает

Я нашел похожий вопрос по SO, но без ответа, как заставить его работать. Прием звонка через Bluetooth-гарнитуру.

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

1 ответ

Прием звонка через Bluetooth-гарнитуру

Добавляю мой ответ оттуда и сюда тоже.

Эти события обрабатываются внутри HeadsetStateMachine (в пакетах / приложениях /Bluetooth).

Эти события перенаправляются в интерфейс IBluetoothHeadsetPhone. Одно приложение, в которое пересылаются все события, определяется во время выполнения с помощью следующего кода привязки в HeadsetStateMachine.java. Это позволяет производителям телефонов пересылать их в пользовательское приложение телефона вместо приложения по умолчанию в тех случаях, когда приложение по умолчанию не используется.

Intent intent = new Intent(IBluetoothHeadsetPhone.class.getName());
    intent.setComponent(intent.resolveSystemService(context.getPackageManager(), 0));
    if (intent.getComponent() == null || !context.bindService(intent, mConnection, 0)) {
        Log.e(TAG, "Could not bind to Bluetooth Headset Phone Service");
    }

Чтобы события перенаправлялись в ваше приложение, а не в телефонное приложение по умолчанию, вам нужно изменить код aosp. Вам нужно будет перехватить события на одном из HeadsetStateMachine, прокси BluetoothHeadsetPhone или в приложении телефона.

К сожалению, то, что вы ищете, в настоящее время невозможно без изменения кода aosp. Некоторые гарнитуры, такие как Plantronics, имеют пользовательские события BT, которые перенаправляются во все приложения - некоторые из существующих приложений VoIP поддерживают эти настраиваемые намерения для поддержки по крайней мере ответа на вызовы для некоторых гарнитур.

Другие вопросы по тегам