简体   繁体   English

配对两个android蓝牙设备而没有任何密码弹出窗口

[英]Pairing two android bluetooth devices without any passkey popup

I want to pair two android bluetooth devices (Kitkat) without any popup for passkey exchange. 我想将两个android蓝牙设备(Kitkat)配对,而没有任何用于交换密钥的弹出窗口。 I tried setpin() and cancelPairingUserInput() methods inside the broadcast receiver for PAIRING_REQUEST intent using reflection, but got no results. 我尝试使用反射在广播接收器内使用setpin()和cancelPairingUserInput()方法来实现PAIRING_REQUEST意图,但没有结果。 Can anyone help me with that ? 有人可以帮我吗?

 if(BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)){

               BluetoothDevice localBluetoothDevice = (BluetoothDevice)intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE");
               try {

                   Log.d("setPin()", "Try to set the PIN");
                   Method m = localBluetoothDevice.getClass().getMethod("setPin", byte[].class);
                   m.invoke(localBluetoothDevice, ByteBuffer.allocate(4).putInt(1234).array());
                   Log.d("setPin()", "Success to add the PIN.");
                 } catch (Exception e) {
                   Log.e("setPin()", e.getMessage());
                 }
               Class localClass = localBluetoothDevice.getClass();
               Class[] arrayOfClass = new Class[0];
               try {
                   localClass.getMethod("setPairingConfirmation", boolean.class).invoke(localBluetoothDevice, true);
                localClass.getMethod("cancelPairingUserInput", arrayOfClass).invoke(localBluetoothDevice, null);
            } catch (IllegalAccessException | IllegalArgumentException
                    | InvocationTargetException | NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           }

Did you try calling createBond() through reflection? 您是否尝试通过反射调用createBond()?

This works for me, with device being a BluetoothDevice: 这对我有用,设备是BluetoothDevice:

Method m = device.getClass().getMethod("createBond", (Class[]) null);
m.invoke(device, (Object[]) null);
  1. Get the device and the PIN (or the pairing key) from the given Intent 从给定的Intent中获取设备和PIN(或配对密钥)
  2. if the given PIN is not -1, set it in the device 如果给定的PIN不为-1,则在设备中进行设置
  3. invoke the device's .setPairingConfirmation() method 调用设备的.setPairingConfirmation()方法

My code (which achieves this) in the .bluetoothEventReceived() callback method, looks something like this: 我在.bluetoothEventReceived()回调方法中的代码(实现此目的)看起来像这样:

private void bluetoothEventRecieved(Context context, Intent intent)
{
    if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)) {
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        int pin = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_KEY, -1);
        if (pin != -1) {
            byte[] pinBytes = String.format(Locale.US, "%04d", pin).getBytes();
            device.setPin(pinBytes);
        }
        device.setPairingConfirmation(true);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM