Bluetooth Broadcastreceiver

  • Antworten:16
Eugen T
  • Forum-Beiträge: 27

29.10.2013, 11:36:50 via Website

Hallo.

Ich habe folgendes Problem:

Ich möchte alle Bluetoothdevices aus dem Intent holen und in das ListView hinzufügen. Sooweit funktioniert es alles, aber der füllt alle Zeilen der Liste mit dem selben Namen des anderen Handy und Adresse.Hier ein Teil von meinem Code:
1public void broadCastReceiver(){
2 final BroadcastReceiver mReceiver = new BroadcastReceiver() {
3 @Override
4 public void onReceive(Context context, Intent intent) {
5 String action = intent.getAction();
6
7
8 if (BluetoothDevice.ACTION_FOUND.equals(action)) {
9 BluetoothDevice newDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
10 listadapter.add(newDevice.getName() + "|" + newDevice.getAddress());
11 }
12 }
13 }; IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
14 registerReceiver(mReceiver, filter);
15 IntentFilter filter2 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
16 registerReceiver(mReceiver, filter2);
17 }

Ich bitte um Hilfe. Danke vorraus.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

29.10.2013, 11:44:53 via App

Wie speicherst du denn die bluetooth devices bzw wie liest du sie aus.
Du musst sie ja irgendwie zwischenspeichern bevor du sie in das listview lädst.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Eugen T
  • Forum-Beiträge: 27

29.10.2013, 12:16:36 via Website

Ich hole die Device mit der Methode intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) speichere sie in der newDevice Variable hole mit der getname() und getaddress den Namen und Adresse tue sie dem adapter hinzufügen und danach Devicelist.setadapter(listadapter).
Er tut sie mir auch hinzufügen in die Liste, aber er dupliziert die Namen mehrmals wenn ich startdiscovery ausführe, wenn ich nochmal startdiscovery drücke füllt er nochmal die Liste mit dem selben Namen nach.

Antworten
Fabian Simon
  • Forum-Beiträge: 359

29.10.2013, 12:56:41 via Website

Das ist normal. da aber die Netzwerk Adresse immer gleich ist kannst du einfach mit einer schleife überprüfen ob dies im aktuellen schon drin ist und nur bei bedarf mit in die liste aufnehmen.

Antworten
Eugen T
  • Forum-Beiträge: 27

29.10.2013, 16:41:52 via Website

Wie soll das vom Quellcode aussehen.Die Methode intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) liefert Objekte zurück und die Liste beinhaltet ja getname und getaddress(beides) also strings. Wie soll ich das vergleichen? die Adresse und Name in der Liste mit der Adresse von den geliefierten Geräten.


Ich bitte um Hilfe.

— geändert am 29.10.2013, 16:42:13

Antworten
Fabian Simon
  • Forum-Beiträge: 359

31.10.2013, 08:43:19 via Website

Habs jetzt hier dirket eingetippt sollte aber so funktionieren.

1public void broadCastReceiver(){
2 final BroadcastReceiver mReceiver = new BroadcastReceiver() {
3 @Override
4 public void onReceive(Context context, Intent intent) {
5 String action = intent.getAction();
6
7
8 if (BluetoothDevice.ACTION_FOUND.equals(action)) {
9 BluetoothDevice newDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
10//************************************folgende Zeilen sind neu *************************************************************
11 boolean valueInList = false;
12 for (String one : listadapter){
13 if (one.equals(newDevice.getName() + "|" + newDevice.getAddress())valueInList = true;
14 }
15 if (!valueInList){
16 listadapter.add(newDevice.getName() + "|" + newDevice.getAddress());
17 }
18//************************************folgende Zeilen sind neu [ENDE]*************************************************************
19
20 }
21 }
22 }; IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
23 registerReceiver(mReceiver, filter);
24 IntentFilter filter2 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
25 registerReceiver(mReceiver, filter2);
26 }

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

31.10.2013, 11:15:11 via Website

Wie wäre es anstatt eines List einfach ein Set zu benutzen, dann bekommst du keine Dublicate in deiner ListView angezeigt.

Ich würde evtl. mir eine Pair Klasse schreiben, Android hat bereits eine, weiss aber gerade nicht ob die equals/hashCode unterstützt damit
ein Set entsprechend funktionieren würde.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Eugen T
  • Forum-Beiträge: 27

31.10.2013, 17:44:00 via Website

Das Beispiel sieht nicht schlecht aus mit der for Schleife,aber das Problem ist: Meinen Listadapter den man durchlaufen muss eintippe, gibt er mit einen Fehler aus, das er nur einen Array oder eine Instanz durchlaufen kann.

Ich habe jetzt folgendes probiert mit dem Set:
1public void broadCastReceiver(){
2 final BroadcastReceiver mReceiver = new BroadcastReceiver() {
3 @Override
4 public void onReceive(Context context, Intent intent) {
5 String action = intent.getAction();
6
7 if (BluetoothDevice.ACTION_FOUND.equals(action)) {
8 BluetoothDevice newDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
9 if (newDevice.getBondState() != BluetoothDevice.BOND_BONDED) {
10 // tut zum set die Strings hinzugügen
11 foundDevicesSet.add(newDevice.getName() + "|" + newDevice.getAddress());
12 //Alle Namen durchlaufen und zum Adapter hinzufügen.Dannach setAdapter
13 for(String one : foundDevicesSet){
14 deviceNameAdapter.add(one);
15
16
17 }
18 }
19 }
20 }; IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
21 registerReceiver(mReceiver, filter);
22 IntentFilter filter2 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
23 registerReceiver(mReceiver, filter2);
24 }

Aber beim Suchen stürzt mir die App ab.Brauch Hilfe komme schon zwei Tage nicht weiter.Im Netz alles schon durchgesucht in Englisch und Deutsch.

Gruß Eugen

— geändert am 31.10.2013, 18:57:35

Antworten
Eugen T
  • Forum-Beiträge: 27

31.10.2013, 23:05:00 via Website

Hier ist der LogCat
Ab da bricht es ab sobald er hinzufügen tut.

110-31 22:53:13.202: V/BluetoothEventManager(9693): Received android.bluetooth.device.action.FOUND
210-31 22:53:13.212: D/myLOG(10816): Gerätenamen hinzufügen zum set hinzufügen
310-31 22:53:13.212: D/AndroidRuntime(10816): Shutting down VM
410-31 22:53:13.212: W/dalvikvm(10816): threadid=1: thread exiting with uncaught exception (group=0x413c32a0)
510-31 22:53:13.222: E/AndroidRuntime(10816): FATAL EXCEPTION: main
610-31 22:53:13.222: E/AndroidRuntime(10816): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetooth.device.action.FOUND flg=0x10 (has extras) } in de.auto.MainActivity$2@41e49490
710-31 22:53:13.222: E/AndroidRuntime(10816): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:765)

Bin mit dem Debugger mal durchgelaufen und die App stürzt genau an der Zeile 11 ab.

— geändert am 31.10.2013, 23:39:48

Antworten
Fabian Simon
  • Forum-Beiträge: 359

04.11.2013, 12:46:57 via Website

Hallo,
ist foundDevicesSet ein Set ?
Wenn ja würde ich mal eine Liste verwenden oder direkt den listadapter in der die Werte angezeigt werden.
Set habe ich persönlich schon selsame Nebeneffekte gehabt.

Auch verstehe ich dein Vorgehen nicht so ganz.
Du trägst den Wert in foundDevicesSet ein um dann mit einer Schleife alle in deviceNameAdapter einzutragen.
Gehe doch hin und durchsuche deviceNameAdapter ob der Gesuchte schon vorhanden ist und wenn nicht trage den neuen ein.
(Siehe mein Beitrag vom 31.10)

Antworten
Eugen T
  • Forum-Beiträge: 27

04.11.2013, 21:47:26 via Website

Ja das ist ein Set. Das Problem ist, wenn ich den Adapter in die Forschleife eintrage,meldet er Error,weil er kann kein adapter durchlaufen kann nur array und Instanz,So steht es zumindest im Fehler.

Ich tue erst in ein Set einfügen dannach in den Adapter funktioniert aber trotzdem nicht,bekomme duplicates,Ohne Adapter kann ich ja kein Listview setzen.
Deine Lösung ist gut bloß mit dem Adapter funktioniert es nicht.

Gruß

— geändert am 04.11.2013, 21:48:01

Antworten
Fabian Simon
  • Forum-Beiträge: 359

05.11.2013, 11:59:05 via Website

Mhm kann ich jetzt nicht so ganz nachvollziehen. (Bin mir ziemlich sicher das ich das selbe schonmal mit einem Listadapter umgesetzt habe. Jedoch war das ein eigener Adapter).
Am schnellsten und übersichtlichsten gehst du hin und schreibst deinen eigenen Adapter.
Den kannst du dann natürlich zum Iterator machen und so in der Forschleife nutzen.
Find grad kein Beispiel.
Solltest du eins brauchen sag bescheid.
Dann kann ich das die Tage mal posten.(Hab grad kein zugriff auf mein code)
Gruß

Antworten
Eugen T
  • Forum-Beiträge: 27

05.11.2013, 18:16:19 via Website

Danke Fabian Simon für deine Zeit, welche du zur Lösung meiner Aufgaben investiert hast.Hat sich alles erledigt,ich mache da nicht lange rum. Vor dem suchen tue die Liste einfach leeren mit clear() und fertig.

Aber ich hab da noch ein nächstes Problem:

Ich kann über meine App Geräte koppeln ich habe zwei Listviews, einmal gefundene Geräte und gekoppelte Geräte,aber wenn ich jetzt kopple muss der Name aus der Liste der gefundenen Geräte in die gekoppelte Geräte springen. Hab schon die Methode versucht wo die Liste refreshen tut, aber da passiert garnichts.Erst nach dem schließen der App und wenn man wieder zurückkehrt erneuern sich die Listen.

Bitte um Hilfe.

Danke Vorraus

Antworten
Eugen T
  • Forum-Beiträge: 27

05.11.2013, 22:13:58 via Website

Habe ich schon versucht funzt nicht. Wenn ich mit einem Geräte koppeln möchte dann kommt dort die anfrage den Passkey zu bestätigen nach dem bestätigen habe ich diese Methode eingesetzt,aber da passiert nichts.

Muss man den adapter dannach wieder ins Listview setzen?weil ich hab ja schon einmal gesetzt.

Gruß

— geändert am 05.11.2013, 22:15:29

Antworten
Fabian Simon
  • Forum-Beiträge: 359

06.11.2013, 16:55:52 via Website

Poste mal den den Adapter den du geschrieben hast.
ich schreibe mal vereinfacht worauf ich hinaus möchte:
1public class BluetoothDevice{
2 public String name,mac;
3 public boolean paired = false;
4 public String toString(){
5 return name + "|" + mac;
6 }
7}

1public class MyAdapter extends BaseAdapter{
2 private List<BluetoothDevice> devicelist = new List<BluetoothDevice>();
3 private final LayoutInflater mInflater;
4 public myAdapter ( Context con) {
5 mInflater = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
6 }
7
8 public void add(BluetoothDevice device){
9 devicelist.add(device);
10 this.notifyDataSetChanged();
11 }
12
13 public int getCount() {
14 return devicelist.size();
15 }
16 public Datensatz getItem(int position) {
17 return devicelist.get(position);
18 }
19 public long getItemId(int position) {
20 return (long) position;
21 }
22 public View getView(int position, View convertView, ViewGroup parent) {
23 TextView itemView = (LinearLayout) mInflater.inflate(R.layout.mylistitemlayout, parent, false);
24 if (!getItem(position).paired){
25 itemView.setText(getItem(position));
26 }else{
27 //mach was anderes
28 }
29 return itemView;
30 }
31}
So in der Art....
Hab das jetzt aber direkt hier reingeschrieben.
Also könnten sich noch ein paar Syntax fehler einschleichen.
Aber so in der Art solltest du bei gepairden geraeten etwas anderes machen koenne als bei den andern. und auch dein urspuengliches problem sollte damit teoretisch behoben sein.

— geändert am 06.11.2013, 16:57:37

Antworten