2015-08-06 16 views
5

Ich schreibe eine Android-Anwendung, in der ich programmatisch mit einem benutzerdefinierten BLE-Gerät verbinden möchte. Ich habe die manuelle Verbindung funktioniert, in der der Benutzer die PIN unter Verwendung der Standard-Android-Bluetooth-Pairing-Dialog eingegeben, aber ich konnte keine Informationen finden, wie ein BLE-Gerät automatisch, ohne Benutzereingriff automatisch zu binden. Ist das möglich? Wenn ja, wie ist der Prozess?Programmatisch verbinden mit BLE-Gerät auf Android

Antwort

-1

Alles, was Sie tun können, um eine Benutzerinteraktion zu vermeiden, ist das Erzwingen der Just Works-Paarung. Um dies zu tun, programmieren Sie das Peripheriegerät so, dass es die Kopplung mit NoInputNoOutput IO Capability akzeptiert.

2

Ich war in der Lage, diese Arbeit die meiste Zeit zu machen, indem eine BroadcastReceiver Registrierung der BluetoothDevice.ACTION_BOND_STATE_CHANGED Absicht zu empfangen und dann BluetoothDevice.setPin Aufruf nach der BluetoothDevice.BOND_BONDING Nachricht zu empfangen. Wie bei den meisten BLE-Dingen in Android scheint dies je nach Gerät und Android-Version etwas unterschiedlich zu sein. Leider kann ich Android nicht daran hindern, auch die Bluetooth-Absicht zu empfangen, so dass der PIN-Eingabebildschirm noch eine Sekunde lang erscheint, bevor die Verbindung hergestellt ist.

private final BroadcastReceiver mReceiver = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      final String action = intent.getAction(); 
      Logger("Broadcast Receiver:" + action); 

      if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) 
      { 
       final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); 

       if(state == BluetoothDevice.BOND_BONDING) 
       { 
        Logger("Bonding..."); 
        if (mDevice != null) { 
         mDevice.setPin(BONDING_CODE.getBytes()); 
         Logger("Setting bonding code = " + BONDING_CODE); 
        } 
       } 
       else if(state == BluetoothDevice.BOND_BONDED) 
       { 
        Logger("Bonded!!!"); 
        mOwner.unregisterReceiver(mReceiver); 
       } 
       else if(state == BluetoothDevice.BOND_NONE) 
       { 
        Logger("Not Bonded"); 
       } 
      } 
     } 
    }; 
+0

Es stellt sich heraus, dass Sie nicht wollen, ACTION_BOND_STATE_CHANGE'. Siehe [meine andere Antwort] (http://stackoverflow.com/a/38241240/265521). – Timmmm

1

ich es geschafft, dies zu tun - here meine Antwort zu sehen.

Die TL; DR ist: vergessen Sie ACTION_BOND_STATE_CHANGED; du brauchst es nicht. Stattdessen hören Sie ACTION_PAIRING_REQUEST, und setzen Sie die Priorität hoch. Wenn Sie im Broadcast-Empfänger ACTION_PAIRING_REQUEST empfangen, rufen Sie setPin() mit Ihrer PIN und dann abortBroadcast() an, um zu verhindern, dass das System die Benachrichtigung anzeigt.