4

我正在使用下面的广播接收器来捕获绑定请求,并在没有用户弹出请求的情况下绑定它。安卓 - BLE绑定编程无法在所有CoolPad上使用注3

private static BroadcastReceiver pairingBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(intent.getAction())) { 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       int type = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR); 

       Toast.makeText(context, "broadcast type "+type, Toast.LENGTH_LONG).show(); 

       if (type == BluetoothDevice.PAIRING_VARIANT_PIN) { 
        if(devicePin != null) { 
         CommonStuff.Log("bond pin "+devicePin); 
         Toast.makeText(context, "broadcast bond pin "+devicePin, Toast.LENGTH_LONG).show(); 
         byte[] pin = new byte[10]; 
         try { 
          pin = (byte[]) BluetoothDevice.class.getMethod("convertPinToBytes", String.class) 
            .invoke(BluetoothDevice.class, devicePin); 
         } catch (IllegalAccessException e) { 

         } catch (InvocationTargetException e) { 

         } catch (NoSuchMethodException e) { 

         } 
         /*for (int i=0; i< pin.length; i++) { 
          CommonStuff.Log("byte bond pin "+pin[i]); 
         }*/ 
         device.setPin(pin); 
         /*if(type == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION || type == 1) { 
          device.setPairingConfirmation(true); 
         }*/ 
         abortBroadcast(); 
        } 
       } 
      } else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())) { 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE); 

       if(state == BluetoothDevice.BOND_BONDING) 
        return; 

        if(state == BluetoothDevice.BOND_BONDED) { 
         Toast.makeText(context, "Bond success", Toast.LENGTH_LONG).show(); 
        } else { 
         Toast.makeText(context, "Bond failed", Toast.LENGTH_LONG).show(); 
        } 
      } 
     } 
    }; 

假设devicePin被全局初始化。这适用于大多数手机。但在coolpad笔记3中,我得到BluetoothDevice.EXTRA_PAIRING_VARIANT值为1。而当我尝试使用setPin()来绑定此设备而未考虑EXTRA_PAIRING_VARIANT值时,绑定失败。

有没有人遇到过这个问题?请帮我解决这个问题。

回答

2

BluetoothDevice.EXTRA_PAIRING_VARIANT as 1表示只有用户可以输入密码。但通过编程方式,我们可以使用名为setpasskey的私有方法来设置密钥。

添加以下代码作为否则如果情况下类型在上面的代码

else 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) { 

    } 
}