通过蓝牙耳机VoIP接听电话

时间:2018-08-01 10:20:28

标签: android bluetooth voip-android

我正在开发VoIP-Android-App,该应用需要能够通过蓝牙耳机接听/拒绝通话。

但是问题是,在向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 +静音+媒体按钮侦听器 第一次点击无效,第二次+次点击正确处理

3)MEDIA_BUTTON接收器不起作用

我在SO上发现了一个类似的问题,但没有答案如何使之工作 Accepting a Call via Bluetooth Headset

那么无论如何,我该如何拦截来自Bluetooth Headset Service的Bluetooth按钮单击?

1 个答案:

答案 0 :(得分:0)

Accepting a Call via Bluetooth Headset

也从这里添加我的答案。

这些事件在HeadsetStateMachine内部处理(在package / apps / 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应用程序支持这些自定义的意图,以支持某些耳机的至少应答呼叫。