16

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

但问题是添加到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 上发现了一个类似的问题,但没有答案如何使它工作 通过蓝牙耳机接听电话

那么无论如何我可以从蓝牙耳机服务中拦截蓝牙按钮点击吗?

4

1 回答 1

2

通过蓝牙耳机接听电话

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

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

于 2018-08-07T08:40:57.527 回答