【问题标题】:Accepting a Call via Bluetooth Headset VoIP通过蓝牙耳机 VoIP 接听电话
【发布时间】:2018-08-01 10:20:27
【问题描述】:

我正在开发一个 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 上发现了一个类似的问题,但没有答案如何使它工作 Accepting a Call via Bluetooth Headset

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

【问题讨论】:

  • 好问题。但是我在android中自动接听电话,我能够通过电话接口自动拒绝电话,但没有找到接听电话的解决方案
  • 我也是,你可以收听 SCO 状态并在断开连接时结束通话,但如何复制相同的内容来接听电话仍然是一个谜
  • 我尝试了很多天,但我了解到一件事,android允许拒绝呼叫,但接受呼叫权限是系统权限,android只会将系统权限授予系统应用

标签: android bluetooth voip-android


【解决方案1】:

Accepting a Call via Bluetooth Headset

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

这些事件在 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 应用程序支持这些自定义意图,以支持至少为某些耳机接听电话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多