蓝牙绑定仅在LG G5上失败

时间:2017-12-01 01:47:09

标签: android bluetooth bluetooth-lowenergy

我正在开发一个连接到自定义蓝牙组件的应用。众所周知,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

谢谢!

1 个答案:

答案 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) {

    }
}