我正在开发 VoIP-Android-App。我想在活动中通过连接的蓝牙耳机接听和拒绝来电。
到目前为止我已经尝试过:
使用媒体会话接收媒体按钮点击。
问题:如果我们启动BluetoothSCO,我们不会收到任何媒体按钮点击。如果我们不启动 BluetoothSCO,我们确实会收到媒体按钮点击,但我们无法区分长按钮和短按钮点击,因为停机时间始终为 0,键码始终为 KEYCODE_MEDIA_PLAY,ACTION_DOWN 紧随其后的是 ACTION_UP。只有当我们通过蓝牙连接时才会出现这些问题。如果我们通过有线耳机连接,我们会得到适当的键码 (KEYCODE_HEADSETHOOK),并且停机时间不是 0。
使用 BroadcastReceiver 监听蓝牙 SCO 连接变化。
private val scoReceiver = object : BroadcastReceiver() { fun onReceive(context: Context, intent: Intent) { val state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1) val previousState = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_PREVIOUS_STATE, -1) if (state == AudioManager.SCO_AUDIO_STATE_DISCONNECTED && previousState == AudioManager.SCO_AUDIO_STATE_CONNECTED) { Log.e(TAG, "SCO Disconnected") hangupCall() } } } protected fun onStart() { super.onStart() val intentFilter = IntentFilter() intentFilter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED) registerReceiver(scoReceiver, intentFilter) }
通过这种方法,我可以检测到用户何时想要挂断电话,例如长按蓝牙耳机,因为这会触发 SCO 断开连接。
问题:我们无法检测用户是否想接听来电。
使用dispatchKeyEvent、onKeyDown和onKeyUp。
问题:他们根本不会被调用。
有人对如何正确处理蓝牙耳机有任何建议或最佳做法吗?非常感谢任何帮助。提前致谢!