无需用户输入引脚即可以编程方式配对蓝牙设备

时间:2013-09-27 10:01:23

标签: java android bluetooth

我尝试连接的蓝牙设备始终使用相同的密码。这可以通过以编程方式设置引脚来配对设备。

在尝试搜索完成后,我最终得到了以下代码:

BluetoothDevice device = getDevice();

//To avoid the popup notification:
device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true);
device.getClass().getMethod("cancelPairingUserInput", boolean.class).invoke(device, true);
byte[] pin = ByteBuffer.allocate(4).putInt(1234).array();
//int pinn = 1234;

//Entering pin programmatically:  
Method ms = device.getClass().getMethod("setPin", byte[].class);
//Method ms = device.getClass().getMethod("setPasskey", int.class);
ms.invoke(device, pin);

//Bonding the device:
Method mm = device.getClass().getMethod("createBond", (Class[]) null);
mm.invoke(device, (Object[]) null);

cancelPairingUserInput给了我一个NoSuchMethodException,这很奇怪,因为该方法确实存在于BluetoothDevice类中。

看起来SetpinSetPasskey没有做任何事情。该设备不会配对。它只在手动输入引脚后成对。

所以唯一有效的代码行是:

//Bonding the device:
Method mm = device.getClass().getMethod("createBond", (Class[]) null);
mm.invoke(device, (Object[]) null);

Logcat输出:

09-27 12:34:46.408: ERROR/App(11671): cancelPairingUserInput [boolean]
        java.lang.NoSuchMethodException: cancelPairingUserInput [boolean]
        at java.lang.Class.getConstructorOrMethod(Class.java:460)
        at java.lang.Class.getMethod(Class.java:915)
        at test.app.bluetooth.model.BluetoothDiscoveryAndPairing.pair(BluetoothDiscoveryAndPairing.java:97)
        at test.app.bluetooth.model.BluetoothDiscoveryAndPairing.access$000(BluetoothDiscoveryAndPairing.java:25)
        at test.app.bluetooth.model.BluetoothDiscoveryAndPairing$1.onReceive(BluetoothDiscoveryAndPairing.java:79)
        at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:756)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4921)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
        at dalvik.system.NativeStart.main(Native Method)

那么我做错了什么?

2 个答案:

答案 0 :(得分:13)

隐藏的方法cancelPairingUserInput在您的设备中不存在。不要使用它。

  1. 你应该为android.bluetooth.device.action.PAIRING_REQUEST注册BroadcastReceiver
  2. 调用createBond()
  3. 等待BroadcastReceiver触发
  4. 在BroadcastReceiver中,如果action是android.bluetooth.device.action.PAIRING_REQUEST 叫这个方法
  5. public void setBluetoothPairingPin(BluetoothDevice device)
    {
        byte[] pinBytes = convertPinToBytes("0000");
        try {
              Log.d(TAG, "Try to set the PIN");
              Method m = device.getClass().getMethod("setPin", byte[].class);
              m.invoke(device, pinBytes);
              Log.d(TAG, "Success to add the PIN.");
              try {
                    device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true);
                    Log.d(TAG, "Success to setPairingConfirmation.");
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    Log.e(TAG, e.getMessage());
                    e.printStackTrace();
                } 
            } catch (Exception e) {
              Log.e(TAG, e.getMessage());
              e.printStackTrace();
            }
    }
    

    它也适用于Android的Jelly Bean版本(4.1.2)的设备。

答案 1 :(得分:2)

这对我有用:

    IntentFilter filter2 = new IntentFilter(
            "android.bluetooth.device.action.PAIRING_REQUEST");
    mActivity.registerReceiver(
            pairingRequest, filter2);

private final BroadcastReceiver pairingRequest = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals("android.bluetooth.device.action.PAIRING_REQUEST")) {
            mBluetoothDevice = needed;
                try {
                    byte[] pin = (byte[]) BluetoothDevice.class.getMethod("convertPinToBytes", String.class).invoke(BluetoothDevice.class, "1234");
                    Method m = mBluetoothDevice.getClass().getMethod("setPin", byte[].class);
                    m.invoke(mBluetoothDevice, pin);
                    mBluetoothDevice.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(mBluetoothDevice, true);
}
    catch(Exception e)
{

    e.printStackTrace();

}