通过蓝牙耳机接听电话 VoIP

Accepting a Call via Bluetooth Headset VoIP

我正在开发 VoIP-Android-App,该应用需要能够 accept/decline 呼叫蓝牙耳机。

但问题是添加到 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 上发现了一个类似的问题,但没有找到如何让它工作的答案 Accepting a Call via Bluetooth Headset

那么有什么方法可以拦截蓝牙耳机服务中的蓝牙按钮点击吗?

Accepting a Call via Bluetooth Headset

也把我的答案从那里添加到这里。

这些事件在 HeadsetStateMachine 内部处理(在 packages/apps/Bluetooth 下)。

这些事件被转发到 IBluetoothHeadsetPhone 接口。所有事件转发到的单个应用程序在 运行 时通过遵循 HeadsetStateMachine.java 中的绑定代码定义。这是为了允许 phone 制造商在不使用默认应用程序的情况下将它们转发到自定义 phone 应用程序而不是默认应用程序。

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

要将事件转发到您的应用程序而不是默认的 phone 应用程序,您必须修改 aosp 代码。 您需要拦截 HeadsetStateMachine 、BluetoothHeadsetPhone 代理或 phone 应用程序之一的事件。

很遗憾,如果不修改 aosp 代码,目前无法获得您正在寻找的内容。 Plantronics 等一些耳机具有转发到所有应用程序的自定义 BT 事件 - 一些现有的 VoIP 应用程序支持这些自定义意图以支持至少应答某些耳机的呼叫。