我正在开发一个VoIP-Android,这个应用程序需要能够接受/拒绝通话,蓝牙耳机认为。
但问题是在加入上海合作组织之后
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 +静音噪声+媒体按钮侦听器对第一次单击无效,second+单击处理正确
3) MEDIA_BUTTON接收机不工作
我在上面发现了一个类似的问题,但没有回答如何使它工作,Accepting a Call via Bluetooth Headset
那么,无论如何,我怎样才能从蓝牙耳机服务中拦截蓝牙按钮?
发布于 2018-08-07 08:40:57
Accepting a Call via Bluetooth Headset
把我的答案也加到这里。
这些事件是在HeadsetStateMachine内部处理的(包/应用程序/蓝牙)。
这些事件被转发到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应用程序支持这些定制意图,以支持-至少回答一些耳机的呼叫。
https://stackoverflow.com/questions/51630886
复制相似问题