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

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

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

    audioManager.startBluetoothSco()
    audioManager.isBluetoothScoOn = true

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

Я уже пробовал:

1) Слушатель государственной системы телефонии (это всегда IDLE)

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

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

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

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

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