据我所知,在 BLE 中启动配对程序有两种方法:
1) 从 API 19 起,您可以通过调用 mBluetoothDevice.createBond() 来开始配对。您无需连接远程 BLE 设备即可开始配对过程。
2) 当你尝试做一个 Gatt 操作时,我们以方法为例
mBluetoothGatt.readCharacteristic(characteristic)
如果需要绑定远程BLE设备进行任何通信,那么回调时
onCharacteristicRead(
BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status)
调用它的status 参数值将等于GATT_INSUFFICIENT_AUTHENTICATION 或GATT_INSUFFICIENT_ENCRYPTION,而不等于GATT_SUCCESS。如果发生这种情况,则配对过程将自动启动。
这是一个示例,用于找出调用 onCharacteristicRead 回调后何时失败
@Override
public void onCharacteristicRead(
BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status)
{
if(BluetoothGatt.GATT_SUCCESS == status)
{
// characteristic was read successful
}
else if(BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION == status ||
BluetoothGatt.GATT_INSUFFICIENT_ENCRYPTION == status)
{
/*
* failed to complete the operation because of encryption issues,
* this means we need to bond with the device
*/
/*
* registering Bluetooth BroadcastReceiver to be notified
* for any bonding messages
*/
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
mActivity.registerReceiver(mReceiver, filter);
}
else
{
// operation failed for some other reason
}
}
其他人提到此操作会自动启动配对程序:
Android Bluetooth Low Energy Pairing
这就是接收器的实现方式
private final BroadcastReceiver mReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
final String action = intent.getAction();
if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED))
{
final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
switch(state){
case BluetoothDevice.BOND_BONDING:
// Bonding...
break;
case BluetoothDevice.BOND_BONDED:
// Bonded...
mActivity.unregisterReceiver(mReceiver);
break;
case BluetoothDevice.BOND_NONE:
// Not bonded...
break;
}
}
}
};