以编程方式配对蓝牙设备,而不需要用户inputPIN码

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

试图search这个如何完成后,我结束了下面的代码:

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不会做任何事情。 该设备不会配对。 只有手动input引脚后才能配对。

所以唯一可行的代码是:

 //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) 

那么我做错了什么?

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

  1. 您应该为android.bluetooth.device.action.PAIRING_REQUEST注册BroadcastReceiver
  2. 调用createBond()
  3. 等待BroadcastReceiver触发
  4. 在BroadcastReceiver中,如果action是android.bluetooth.device.action.PAIRING_REQUEST,则调用此方法
 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)的设备。

这对我很有用:

  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(); }