Accepting a Call via Bluetooth Headset VoIP

好久不见. 提交于 2019-12-06 17:17:58

问题


I am working on a VoIP-Android-App and The app needs to be able to accept/decline call thought Bluetooth headset.

But the problem is that after adding connection to SCO

    audioManager.startBluetoothSco()
    audioManager.isBluetoothScoOn = true

Once I click to the headset button I can hear a sound that usually comes when I accept call using telephony, so I assume that some android system component catch this signal and doesn't throw it further

What I've tried already:

1) Telephony State listener (It is always IDLE)

   val tm = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
   phoneStateListener = MyPhoneStateListener()
   tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE)

2) MediaSession + silent noise + media button listener Doesn't work for the first click, second+ clicks handled correctly

3) MEDIA_BUTTON receiver doesn't work

I found a similar question on SO but without the answer how to make it work Accepting a Call via Bluetooth Headset

So is there anyway how I can intercept Bluetooth button click from Bluetooth Headset Service?


回答1:


Accepting a Call via Bluetooth Headset

Adding my answer from there to here too.

These events are handled internally in HeadsetStateMachine (under packages/apps/Bluetooth).

These events are forwarded to IBluetoothHeadsetPhone interface. The single application to which all the events are forwarded is defined at run-time by following binding code in HeadsetStateMachine.java. This is to allow phone manufacturers to forward them to custom phone application instead of default one in cases where default one is not used.

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");
    }

To make the events get forwarded to your application instead of default phone application you would have to modify aosp code. You would need to intercept the events at one of HeadsetStateMachine , BluetoothHeadsetPhone proxy or the phone application.

Unfortunately what you are looking for is currently not possible without modifying aosp code. Some headsets like Plantronics have custom BT events which are forwarded to all applications - some of the existing VoIP applications support these custom intents to support at-least answering calls for some of the headsets.



来源:https://stackoverflow.com/questions/51630886/accepting-a-call-via-bluetooth-headset-voip

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!