2013-09-27 167 views
17

我试图连接的蓝牙设备始终具有相同的PIN码。这应该可以通过以编程方式设置引脚来配对设备。以编程方式配对蓝牙设备,而无需用户输入PIN码

试图寻找如何可以这样做之后,我结束了下面的代码:

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) 

那我做错了吗?

+0

@DuncanJones我加堆栈跟踪到我的startpost。 – user1816451

回答

11

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

  1. 您应该注册的BroadcastReceiver的android.bluetooth.device.action.PAIRING_REQUEST
  2. 呼叫createBond()
  3. 等待广播接收器来触发
  4. 在广播接收器,如果动作是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(); 
     } 
} 

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

+2

这可以在19年前的API级别完成吗? android.bluetooth.device.action.PAIRING_REQUEST仅在API 19上引入 – FOliveira

+0

为什么需要setPairingConfirmation()? Android文档说它只适用于PAIRING_VARIANT_PASSKEY_CONFIRMATION,而不是传统配对。此外,在Android6上,它需要BLUETOOTH_PRIVILEGED –

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

} 
+0

这个代码是否只需要配对的设备?我们不需要其他正在配对的设备上的任何代码? –

+0

您不需要任何代码到其他设备。你应该接受连接。 (我为连接到移动打印机的android手机编写了此代码。) –

相关问题