概观
我目前正在开发支持VoIP呼叫的Android应用程序(使用webrtc)。一切都很完美,但现在我正在尝试增加对蓝牙耳机的支持。如果出现以下情况,我希望自动接听/挂断电话(用户无需触摸设备的屏幕):
问题
我仍然在努力做这项工作。我已经阅读了所有相关的堆栈溢出问题(如this和this),但仍然没有运气。我尝试过的:
bluetoothAdapter.getProfileProxy(context, serviceListener, BluetoothProfile.HEADSET)
获取蓝牙配置文件代理。BluetoothProfile.ServiceListener
)上检查获得的BluetoothHeadset
是否有连接的蓝牙设备。如果为真,请注册一个BroadcastReceiver
,其中包含IntentFilter
,android.intent.action.MEDIA_BUTTON
和android.media.ACTION_SCO_AUDIO_STATE_UPDATED
的android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED
,并调用audioManager.startBluetoothSco()
。我只收到android.media.ACTION_SCO_AUDIO_STATE_UPDATED
行动的广播。我的做法有什么问题?
任何帮助,将不胜感激。
我还没有开发VoIP应用程序,所以在这种情况下我不确定正确的事件序列和控制调用。不确定这可以提供帮助,只是从蓝牙的角度来看一些注意事项。意图BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED
(android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED
)是关于BluetoothHeadset
的RFCOMM连接,如果为特定的免提单元启用了Handsfree / Headset配置文件并且正在使用免提装置,它将保持活动状态。您需要这些意图来检测是否需要处理BluetoothHeadset状态,因此在呼叫期间您将不会收到它们。您还可以为BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED
意图(android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED
)注册接收器。在BluetoothHeadset源中并相应地在Android文档中将其描述为“A2DP配置文件的音频连接状态”,但这是错误的。这是免提/耳机物理音频SCO连接的状态。此连接在语音呼叫,蓝牙语音识别和振铃期间处于活动状态(如果支持并启用了“带内振铃”功能)。我不记得BluetoothHeadset音频状态如何涉及AudioManager的SCO状态。