对蓝牙配对对话输入的反应
Reaction to Bluetooth Pairing dialog input
我正在开发一个应用程序,通过蓝牙将 android 设备与另一个设备(CAN 模块)连接起来。
我像这样配对以前未配对的设备:
Method m = device.getClass().getMethod("createBond", (Class[]) null);
m.invoke(device, (Object[]) null);
这很有魅力。
但是有一个问题。 CAN 模块的设置方式使您不需要管脚或任何其他形式的配对确认,您只需说您想与设备配对,它就会这样做。现在,如果我的应用程序尝试连接到不是 CAN 模块的蓝牙设备,例如 phone,会发生什么情况?
在这种情况下,会出现一个对话框,要求用户确认配对。我不介意对话框,但我想以某种方式对 "Cancel" 按钮做出反应。
总结一下:
当用户在蓝牙配对确认对话框中按下 Cancel
时,我想调用方法 doSomething()
。这可能吗?
我用这个 Question 找到了一个 solution/workaround。
要对用户取消配对请求作出反应,我们需要查找以下操作:BluetoothDevice.ACTION_BOND_STATE_CHANGED
和设备的绑定状态通过EXTRA_BOND_STATE
这里有一个例子:
private void pairDevice(BluetoothDevice device){
try{
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
ctx.registerReceiver(receiver, filter);
Method m = device.getClass().getMethod("createBond", (Class[]) null);
m.invoke(device, (Object[]) null);
}catch(Exception e){
e.printStackTrace();
}
}
在您的 BroadcastReceiver 中
public void onReceive(Context context, Intent intent){
String action = intent.getAction();
if(action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED){
int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1);
if(state < 0){
//we should never get here
}
else if(state == BluetoothDevice.BOND_BONDING){
//bonding process is still working
//essentially this means that the Confirmation Dialog is still visible
}
else if(state == BluetoothDevice.BOND_BONDED){
//bonding process was successful
//also means that the user pressed OK on the Dialog
}
else if(state == BluetoothDevice.BOND_NONE){
//bonding process failed
//which also means that the user pressed CANCEL on the Dialog
doSomething(); //we can finally call the method
}
}
}
你应该听听ACTION_BOND_STATE_CHANGED Intent(我希望你知道如何注册BroadcastReceiver并使用它们)。
以上由系统(BluetoothService)广播的动作还包含Current Bond State
和Previous Bond State
。
邦德一共有三个州。
BOND_BONDED表示远程设备绑定(配对)。
BOND_BONDING 表示正在与远程设备绑定(配对)。
BOND_NONE 表示远程设备未绑定(配对)。
在您的情况下,如果密码对话框上有取消按钮,您将收到 BOND_BONDING >> BOND_NONE
,如果密码对话框上有配对按钮,您将收到 BOND_BONDING >> BOND_BONDED
我正在开发一个应用程序,通过蓝牙将 android 设备与另一个设备(CAN 模块)连接起来。
我像这样配对以前未配对的设备:
Method m = device.getClass().getMethod("createBond", (Class[]) null);
m.invoke(device, (Object[]) null);
这很有魅力。
但是有一个问题。 CAN 模块的设置方式使您不需要管脚或任何其他形式的配对确认,您只需说您想与设备配对,它就会这样做。现在,如果我的应用程序尝试连接到不是 CAN 模块的蓝牙设备,例如 phone,会发生什么情况?
在这种情况下,会出现一个对话框,要求用户确认配对。我不介意对话框,但我想以某种方式对 "Cancel" 按钮做出反应。
总结一下:
当用户在蓝牙配对确认对话框中按下 Cancel
时,我想调用方法 doSomething()
。这可能吗?
我用这个 Question 找到了一个 solution/workaround。
要对用户取消配对请求作出反应,我们需要查找以下操作:BluetoothDevice.ACTION_BOND_STATE_CHANGED 和设备的绑定状态通过EXTRA_BOND_STATE
这里有一个例子:
private void pairDevice(BluetoothDevice device){
try{
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
ctx.registerReceiver(receiver, filter);
Method m = device.getClass().getMethod("createBond", (Class[]) null);
m.invoke(device, (Object[]) null);
}catch(Exception e){
e.printStackTrace();
}
}
在您的 BroadcastReceiver 中
public void onReceive(Context context, Intent intent){
String action = intent.getAction();
if(action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED){
int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1);
if(state < 0){
//we should never get here
}
else if(state == BluetoothDevice.BOND_BONDING){
//bonding process is still working
//essentially this means that the Confirmation Dialog is still visible
}
else if(state == BluetoothDevice.BOND_BONDED){
//bonding process was successful
//also means that the user pressed OK on the Dialog
}
else if(state == BluetoothDevice.BOND_NONE){
//bonding process failed
//which also means that the user pressed CANCEL on the Dialog
doSomething(); //we can finally call the method
}
}
}
你应该听听ACTION_BOND_STATE_CHANGED Intent(我希望你知道如何注册BroadcastReceiver并使用它们)。
以上由系统(BluetoothService)广播的动作还包含Current Bond State
和Previous Bond State
。
邦德一共有三个州。
BOND_BONDED表示远程设备绑定(配对)。
BOND_BONDING 表示正在与远程设备绑定(配对)。
BOND_NONE 表示远程设备未绑定(配对)。
在您的情况下,如果密码对话框上有取消按钮,您将收到 BOND_BONDING >> BOND_NONE
,如果密码对话框上有配对按钮,您将收到 BOND_BONDING >> BOND_BONDED