2013-06-18 122 views
30

我正在开发一个应用程序,我想要连接蓝牙设备的主要问题是我不希望用户输入所需的引脚而不是应用程序应该由他自己做...我不有任何连接相关的问题......只想插入并完成应用程序本身的引脚认证过程。如何以编程方式配对蓝牙设备Android

我发现下面的代码我相信它是工作,但不知道如何在此代码中添加PIN?

private void pairDevice(BluetoothDevice device) { 
     try { 
      Log.d("pairDevice()", "Start Pairing..."); 
      Method m = device.getClass().getMethod("createBond", (Class[]) null); 
      m.invoke(device, (Object[]) null); 
      Log.d("pairDevice()", "Pairing finished."); 
     } catch (Exception e) { 
      Log.e("pairDevice()", e.getMessage()); 
     } 
    } 

有谁知道如何在上面的代码或任何类似的代码来解决问题进入销.. 谢谢

+0

也许这会帮助你。 http://stackoverflow.com/questions/5885438/bluetooth-pairing-without-user-confirmation 干杯, –

+0

@ManolescuSebastian - 我想建立安全连接... –

+0

试试我的答案。我希望它适合你 –

回答

3

试试这个代码:

public void pairDevice(BluetoothDevice device) 
{ 
    String ACTION_PAIRING_REQUEST = "android.bluetooth.device.action.PAIRING_REQUEST"; 
    Intent intent = new Intent(ACTION_PAIRING_REQUEST); 
    String EXTRA_DEVICE = "android.bluetooth.device.extra.DEVICE"; 
    intent.putExtra(EXTRA_DEVICE, device); 
    String EXTRA_PAIRING_VARIANT = "android.bluetooth.device.extra.PAIRING_VARIANT"; 
    int PAIRING_VARIANT_PIN = 0; 
    intent.putExtra(EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(intent); 
} 

Intent intent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST); 
intent.putExtra(EXTRA_DEVICE, device); 
int PAIRING_VARIANT_PIN = 272; 
intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN); 
sendBroadcast(intent); 

Intent intent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS); 
startActivityForResult(intent, REQUEST_PAIR_DEVICE); 

我希望这有助于

参考:http://pastebin.com/N8dR4Aa1

+0

请帮我.. ...我想要启用BT的设备列表,并在点击特定的蓝牙设备后,与我们的设备配对 –

+2

我得到第一种方法,但您建议我们如何处理其他两个代码块? – gregm

1

试试这个,

BluetoothDevice device = intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE"); 
device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true); 
device.getClass().getMethod("cancelPairingUserInput", boolean.class).invoke(device); 
8

所以,我有这个问题,如果有人需要这个工作在android 4.4.2的答案。

IntentFilter filter = new IntentFilter(
       "android.bluetooth.device.action.PAIRING_REQUEST"); 


     /* 
     * Registering a new BTBroadcast receiver from the Main Activity context 
     * with pairing request event 
     */ 
     registerReceiver(
       new PairingRequest(), filter); 

而接收器的代码。

public static class PairingRequest extends BroadcastReceiver { 
     public PairingRequest() { 
      super(); 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals("android.bluetooth.device.action.PAIRING_REQUEST")) { 
       try { 
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
        int pin=intent.getIntExtra("android.bluetooth.device.extra.PAIRING_KEY", 0); 
        //the pin in case you need to accept for an specific pin 
        Log.d("PIN", " " + intent.getIntExtra("android.bluetooth.device.extra.PAIRING_KEY",0)); 
        //maybe you look for a name or address 
        Log.d("Bonded", device.getName()); 
        byte[] pinBytes; 
        pinBytes = (""+pin).getBytes("UTF-8"); 
        device.setPin(pinBytes); 
        //setPairing confirmation if neeeded 
        device.setPairingConfirmation(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

并在清单文件中。

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 

而且广播接收器。

<receiver android:name=".MainActivity$PairingRequest"> 
       <intent-filter> 
        <action android:name="android.bluetooth.device.action.PAIRING_REQUEST" /> 
        <action android:name="android.bluetooth.device.action.PAIRING_CANCEL" /> 
       </intent-filter> 
</receiver> 
1
BluetoothSocket bluetoothSocket = null; 
    try { 
     bluetoothSocket = device.createRfcommSocketToServiceRecord(UUID.fromString(UUID_DIVING)); 
    } catch (IOException e) { 
     Log.i("Bluetooth", "IOException = " + e.getMessage()); 
     e.printStackTrace(); 
    } 

    try { 
     byte[] pin = (byte[]) BluetoothDevice.class.getMethod("convertPinToBytes", String.class).invoke(BluetoothDevice.class, "0000"); 
     Method m = device.getClass().getMethod("setPin", byte[].class); 
     m.invoke(device, (Object) pin); 
     device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true); 
    } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { 
     Log.i("Bluetooth", "IOException = " + e.getMessage()); 
     e.printStackTrace(); 
    } 

    try { 
     if (bluetoothSocket != null) { 
      bluetoothSocket.connect(); 
      Log.i("Bluetooth", "bluetoothSocket.connect() "); 
      InputStream inputStream = bluetoothSocket.getInputStream(); 
      OutputStream outputStream = bluetoothSocket.getOutputStream(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
0

如何设置PIN码上面已经回答(这帮助我)。然而,我分享了我的简单代码,下面与Android 6合作:

BluetoothAdapter mBTA = BluetoothAdapter.getDefaultAdapter(); 
if (mBTA.isDiscovering()) mBTA.cancelDiscovery(); 
mBTA.startDiscovery(); 
... 

/** In a broadcast receiver: */ 

if (BluetoothDevice.ACTION_FOUND.equals(action)) { // One device found. 

    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
    Log.d(TAG, "Start Pairing... with: " + device.getName()); 
    device.createBond(); 
} 

// If you want to auto-input the pin#: 
else if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)){ 

        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
        device.setPin("1234".getBytes()); 
} 
相关问题