通过蓝牙耳机接听电话 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 应用程序支持这些自定义意图以支持至少应答某些耳机的呼叫。
我正在开发 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 应用程序支持这些自定义意图以支持至少应答某些耳机的呼叫。