我正在开发一个连接到自定义蓝牙组件的应用。众所周知,Android上的蓝牙是一场噩梦。
连接,配对和绑定适用于所有三星设备(S5,S6,S7,S8),但在运行Android 6的LG G5上失败。
问题出在特定设备上。 它进入绑定状态BOND_BONDING绑定,我看到这个日志条目:
****** ACTION_BOND_STATE_CHANGED - BOND STATE 11
但它永远不会去BOND_BONDED。相反,我会在一段时间后获得BOND_NONE。
****** ACTION_BOND_STATE_CHANGED - BOND STATE 10
我认为不值得共享整个代码,因为这是特定版本的问题,因此代码是正确的。我正在寻找解决此问题的建议或想法。
// Handles various events fired by the BluetoothService.
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
switch (action) {
case BluetoothService.ACTION_DATA_AVAILABLE://Received data from the device
// Doing stuff
break;
case BluetoothService.ACTION_GATT_SERVICES_DISCOVERED:
// Doing more stuff
break;
case BluetoothDevice.ACTION_ACL_CONNECTED:
// Doing amazing stuff
break;
case BluetoothDevice.ACTION_BOND_STATE_CHANGED:
Integer bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, 0);
Log.d("MainActivity", "****** ACTION_BOND_STATE_CHANGED - BOND STATE " + bondState.toString());
break;
}
}
};
供参考 BOND_NONE是10。 BOND_BONDING是11。 BOND_BONDED是12。
https://stuff.mit.edu/afs/sipb/project/android/docs/reference/android/bluetooth/BluetoothDevice.html
谢谢!
答案 0 :(得分:3)
请检查BluetoothDevice.EXTRA_PAIRING_VARIANT
如果BluetoothDevice.EXTRA_PAIRING_VARIANT
为1则表示只有用户可以输入passkey
。但是我们可以通过编程方式使用名为setpasskey
的私有方法设置密钥。
请使用以下代码:
if(type == 1) {
int pin = Integer.parseInt(devicePin);
try {
device.getClass().getMethod("setPasskey", int.class)
.invoke(device, pin);
abortBroadcast();
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
} catch (NoSuchMethodException e) {
}
}