android - 配对过程后蓝牙 BLE 设备未绑定
问题描述
我正在研究BLE,要求如下:
有一个从我的本地数据库加载的设备列表。
在点击特定设备或行时,我必须检查设备是否已绑定,如果已绑定,我必须导航到特定屏幕。如果未绑定,则配对对话框将成功打开,我还可以输入密码以配对该 BLE 设备。
但问题是在输入正确的 Pair 密码后,我无法在广播接收器中获得 BLE 设备的 BONDED 状态,如下所示:
(注意:我们知道如果 BLE 未绑定并且我们尝试连接,则配对对话框将自动打开。)
请检查以下代码:
private fun initializeBluetoothBroadcastReceiver() {
bluetoothBroadCastReceiver= object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.e("%%%%% ", "%%%%% inside onreceive")
val action = intent.action
if (action == BluetoothAdapter.ACTION_STATE_CHANGED) {
Log.e("%%%%% ", "%%%%% inside ACTION_STATE_CHANGED")
if (bleManager.bluetoothGatt?.device?.bondState == BluetoothDevice.BOND_BONDED) {
Log.e("%%%%% ", "%%%%% inside BOND_BONDED")
if (isBleDeviceConnected) {
Log.e("%%%%% ", "%%%%% inside isBleDeviceConnected")
bleManager.bluetoothGattCallback?.writeTime()
loadBatteryStatusFragement(false)
}
}else{
Log.e("%%%%% ", "%%%%% inside not BOND_BONDED")
}
}else{
Log.e("%%%%% ", "%%%%% inside ACTION_STATE_CHANGED ELSE")
}
}
}
val filter1 = IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)
filter1.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED)
registerReceiver(bluetoothBroadCastReceiver, filter1)
}
因此,如果 BLE 设备未配对,如果我正在尝试,那么 - > 配对弹出窗口正在打开,并且在成功输入密码后,我得到以下日志:
%%%%%: %%%%% inside onreceive
%%%%%: %%%%% inside ACTION_STATE_CHANGED ELSE
并且没有进入BOND_BONDED
可能是什么问题?谢谢。
解决方案
使用的 FLAG 存在问题。
而不是使用这个标志:ACTION_STATE_CHANGED
if (action == BluetoothAdapter.ACTION_STATE_CHANGED) {
我们必须使用这个标志:ACTION_BOND_STATE_CHANGED
if (action == BluetoothDevice.ACTION_BOND_STATE_CHANGED) {
解决的代码如下:
private fun initializeBluetoothBroadcastReceiver() {
bluetoothBroadCastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val action = intent.action
if (action == BluetoothDevice.ACTION_BOND_STATE_CHANGED) {
if (bleManager.bluetoothGatt?.device?.bondState == BluetoothDevice.BOND_BONDED) {
if(isBleDeviceConnected)
{
performNecessaryAction()
}else{
showConnectionFailedDialog()
}
} else if (bleManager.bluetoothGatt?.device?.bondState == BluetoothDevice.BOND_NONE) {
try {
isBleDeviceConnected = false
DialogUtils.showPairingFailedDialog(
this@HomeActivity,
objLanguageJson?.error_message?.err_battery_pairing_failed
)
performNecessaryAction()
} catch (e: Exception) {
e.printStackTrace()
}
} else if (bleManager.bluetoothGatt?.device?.bondState == BluetoothDevice.BOND_BONDING) {
Log.e("%%%%% ", "%%%%% bonding none")
}
} else if (action == BluetoothAdapter.ACTION_STATE_CHANGED) {
val state =
intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)
Log.e("%%%%% ", "%%%%% state name >>> " + state)
when (state) {
BluetoothAdapter.STATE_OFF -> {
Log.e("%%%%% ", "%%%%% bluetooth turns off ")
val bluetoothAdapter: BluetoothAdapter =
BluetoothAdapter.getDefaultAdapter()
val isEnabled: Boolean = bluetoothAdapter.isEnabled
if (!isEnabled) {
bluetoothAdapter.enable()
}
if (isBleDeviceConnected) {
isBleDeviceConnected = false
BluetoothAdapter.STATE_TURNING_OFF -> {
}
BluetoothAdapter.STATE_ON -> {
}
BluetoothAdapter.STATE_TURNING_ON -> {
}
}
}
}
}
val filter = IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED)
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED)
registerReceiver(bluetoothBroadCastReceiver, filter)
}
推荐阅读
- visual-studio - VS2019+Qt5:UI 未更新
- amazon-web-services - 在 AWS Athena 中使用小于运算符不起作用
- python - KeyError:“['index'] 均不在列中”
- security - google cast 自定义消息的安全性如何?
- r - R:在绘图中自动缩放图表轴时如何忽略形状?
- python - 被继承的类能看到父类上值的变化吗?
- python - 期待“字符串”,在请求响应中得到“未定义”
- javascript - 用道具装点
- c# - 是否可以创建自定义 PowerPoint PresenterView?
- apache-pig - 如果存在多个值,则Apache Pig Group by和Filter?