Прием звонка через гарнитуру 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 поддерживают эти настраиваемые намерения для поддержки по крайней мере ответа на вызовы для некоторых гарнитур.