通过蓝牙耳机接听电话

Dar*_*sch 12 android headset android-bluetooth android-broadcastreceiver voip-android

我正在开发VoIP-Android-App.我想通过活动中的连接蓝牙耳机接受和拒绝来电.

到目前为止我尝试了什么:

  • 使用媒体会话接收媒体按钮点击.

    问题:如果我们启动BluetoothSCO,我们不会收到任何Media Button点击.如果我们不启动BluetoothSCO,我们会收到Media Button点击,但我们无法区分长按和短按,因为停机时间始终为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)
    }
    
    Run Code Online (Sandbox Code Playgroud)

    通过这种方法,我可以检测用户何时挂断电话,例如长按蓝牙耳机,因为这会触发SCO断开连接.

    问题:我们无法检测用户是否想接听来电.

  • 使用dispatchKeyEvent,onKeyDownonKeyUp.

    问题:他们从来没有被召唤过.

有没有人有任何建议或最佳实践如何正确处理蓝牙耳机?非常感谢任何帮助.提前致谢!

han*_*k15 2

在正常和虚拟语音通话(包括响铃)期间,蓝牙耳机单元按钮的所有事件均由蓝牙耳机服务内部处理,不会作为按钮事件进行广播。蓝牙耳机服务将这些事件重定向到电信框架(answer/hangupCall)。