Bluetooth: Verbinden funktioniert nicht zuverlässig

  • Antworten:4
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 39

15.09.2018, 13:40:32 via Website

Moin zusammen,

ich wollte mich mal mehr mit Bluetooth beschäftigen und habe mir deshalb mit Hilfe eines Tutorials eine kleine Chat-App gebaut.
Anstatt aber, wie im Tutorial beschrieben, eine Liste mit den verbundenen Geräten anzuzeigen, habe ich meinen Chat so programmiert, dass der Client die Liste der verbundenen Geräte durchgeht und bei jedem Gerät, dass auch ein Smartphone ist, versucht, eine Verbindung herzustellen, bis es funktioniert hat.

Zuerst hat das auch ganz gut funktioniert, bis mir aufgefallen ist, dass es immer nur in dieselbe Richtung funktioniert. Außerdem scheint es auch immer nur beim ersten Mal zu funktionieren. Wenn ich die Verbindung beende und mich neu verbinden will, funktioniert es gar nicht mehr, egal, ob ich wieder die Liste durchgehe, oder mir die Device, mit der ich schon einmal verbunden war, merke.

Ich habe noch ein paar Sachen probiert, um den Fehler zu finden und bin am Ende zu folgendem Schluss gekommen:
Wenn ich beim starten diese Funktion ausführe und dann mit "bluetoothDevices" weiterarbeite, funktioniert es beim ersten Mal immer:

    BluetoothAdapter bluetoothAdapter = 
       BluetoothAdapter.getDefaultAdapter();
    bluetoothDevices = bluetoothAdapter.getBondedDevices();

Sobald ich aber zum Beispiel die bondedDevices aus dem Set in ein anderes kopiere (warum auch immer man das tun sollte) funktioniert es gar nicht mehr:

    BluetoothAdapter bluetoothAdapter = 
          BluetoothAdapter.getDefaultAdapter();
    Set<BluetoothDevice> bondedDevices = 
           bluetoothAdapter.getBondedDevices();
    bluetoothDevices = new HashSet<>();
    for (BluetoothDevice bondedDevice : bondedDevices)
        bluetoothDevices.add(bondedDevice);

Bei dem Client kommt beim Verbindungsversuch mit demselben Gerät, mit dem es davor funktioniert hat, diese Exception:

W/System.err: java.io.IOException: read failed, socket might closed or timeout, read ret: -1
W/System.err: at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:520)
at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:531)
at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:323)
at de.rsdevstudio.library.android.SimpleBluetooth$InternalClient.run(SimpleBluetooth.java:301)

Ich verstehe nicht, warum es einen Unterschied macht, wenn ich die Objekte einfach woanders reinschreibe. Habe ich irgendeinen Denkfehler in dem ganzen?

Diskutiere mit!
  • Forum-Beiträge: 487

15.09.2018, 14:26:36 via Website

Hi also meiner Meinung ist dein „Set“ falsch geht so nicht.

Set bondedDevices = bluetoothAdapter.getBondedDevices();

damit wird kein Objekt erstellt.
Auch das mit der for Schleife ist falsch, irgentwie ist das alles durcheinander.

Versuche es mal so

BluetoothAdapter bluetoothAdapter =  BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> bondedDevices = new HashSet<BluetoothDevice>();
bondedDevices.addALL(bluetoothAdapter.getBondedDevices());

— geändert am 15.09.2018, 15:04:59

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 39

15.09.2018, 15:25:55 via Website

Ach, sorry, hatte vergessen dazu zu schreiben, dass

Set<BluetoothDevice> bluetoothDevices;

global in der Klasse definiert ist und da später noch andere Methoden darauf zugreifen. ^^
Die Sachen, die ich kopiert habe, stehen im Konstruktor.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 487

15.09.2018, 16:33:33 via Website

egal wie es auch sei deine for schleife ist sinnlos.

— geändert am 15.09.2018, 17:06:33

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 39

15.09.2018, 17:51:16 via Website

Das stimmt. Ich wollte damit nur Illustrieren, dass es sich um dieselben BluetoothDevice-Objekte handelt, und es trotzdem nicht mehr funktioniert. :-)

Jedenfalls habe ich jetzt noch ein paar Sachen ausprobiert und habe festgestellt, dass es anscheinend ein Problem ist, dass ich den BluetoothAdapter nur lokal in der Methode deklariert habe:

BluetoothAdapter bluetoothAdapter = 
          BluetoothAdapter.getDefaultAdapter();

Ich habe den jetzt auch global in der Klasse deklariert und hole mir das Set mit den bondedDevices erst direkt vor meinen Verbindungs-Versuchen. Ich war davon ausgegangen, dass man mit "BluetoothAdapter.getDefaultAdapter()" immer dieselbe Instanz zurückbekommt, aber das stimmte wohl nicht.

Das Verbinden und Chatten klappt jetzt normal, nur das wieder verbinden nach einem Abbruch scheint noch nicht so wirklich zu funktionieren, aber ich habe leider noch keinen Anhaltspunkt, wieso.

Hilfreich?
Diskutiere mit!

Empfohlene Artikel