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
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.
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");
}
}
}
};
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.
Es stellt sich heraus, dass Sie nicht wollen, ACTION_BOND_STATE_CHANGE'. Siehe [meine andere Antwort] (http://stackoverflow.com/a/38241240/265521). – Timmmm