对蓝牙配对对话框输入的反应

时间:2015-02-23 08:12:30

标签: android bluetooth

我正在开发一款通过蓝牙连接Android设备和其他设备(CAN模块)的应用程序。

我将之前未配对的设备配对:

Method m = device.getClass().getMethod("createBond", (Class[]) null);
m.invoke(device, (Object[]) null);

这就像魅力一样。

但是有一个问题。 CAN模块的设置方式使您不需要引脚或任何其他形式的配对确认,您只需说您要与设备配对,它就会这样做。现在,如果我的应用程序试图连接到不是CAN模块的蓝牙设备(例如手机)会发生什么?

在这种情况下,会出现一个对话框,要求用户确认配对。我不介意对话,但我想对"取消"做出反应。按钮以某种方式。

总结一下: 当用户在蓝牙配对确认对话框上按doSomething()时,我想调用方法Cancel。这可能吗?

2 个答案:

答案 0 :(得分:3)

你应该听ACTION_BOND_STATE_CHANGED Intent(我希望你知道如何注册BroadcastReceiver并使用它们。)

系统(蓝牙服务)广播的上述操作还包含Current Bond StatePrevious Bond State

有三个邦德州。

BOND_BONDED 表示远程设备已绑定(已配对)。

BOND_BONDING 表示正在与远程设备进行绑定(配对)。

BOND_NONE 表示远程设备未绑定(已配对)。

在您的情况下,如果PassKey对话框上有取消按钮,您将收到BOND_BONDING >> BOND_NONE,如果PassKey对话框中有Pair按钮,则会收到BOND_BONDING >> BOND_BONDED

答案 1 :(得分:1)

我找到了这个Question的解决方案/解决方法。

要对用户取消配对请求作出反应,我们需要查找以下操作: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
        }
    }
}