2012-03-23 7 views
0

Bei der Entdeckung anderer Bluetooth-Geräte bekomme ich 2 Sendungen für jedes gefundene Gerät gesendet. Der erste wird während des Scans gesendet, und beim Abschluss des Scans wird eine Übertragung für alle gefundenen Geräte auf einmal gesendet. Ich passe das BluetoothChat-Beispiel im SDK an. HierAndroid Bluetooth Discovery

ist mein 'BroadcastReceiver':

private final BroadcastReceiver foundRec = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (action.equals(BluetoothDevice.ACTION_FOUND)) { 

      Log.e(TAG, "--- device found ---"); 

      BluetoothDevice dev = intent 
        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 

      if (dev.getBondState() == BluetoothDevice.BOND_BONDED) { 
       availableDevices.add(dev.getName() + " (paired)"); 
      } else { 
       availableDevices.add(dev.getName()); 
      } 

     } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)){ 

      Log.d(TAG, "DISCOVERY STARTED"); 
      findViewById(R.id.lookup).setVisibility(View.VISIBLE); 

     } 
    } 
}; 

Thank you!

+0

Ich glaube, Sie testen Ihre App auf Samsung-Gerät, Ritus? – waqaslam

+0

Vielleicht habe ich es verpasst, aber was ist deine Frage? –

+0

Ich teste auf einem HTC. Frage ist, wie man jedes zweimal gefundene Gerät vermeidet. –

Antwort

1

Ich behalte eine Reihe von Geräten. Jedes Mal, wenn ACTION_FOUND empfangen wird, gehe ich durch das Geräte-Array, um zu prüfen, ob es vorhanden ist. Meine Syntax ist vielleicht nicht richtig, in Browser eingegeben ... aber hoffentlich kommst du auf die Idee.

Ich weiß nicht, wofür Sie Ihr availableDevices-Array verwenden, aber es könnte nützlicher sein, wenn Sie ein BluetoothDevice-Array anstelle von String-Array verwenden. Sie können den Namen immer abrufen und außerhalb von onReceive auf den verknüpften Status prüfen.

private final BroadcastReceiver foundRec = new BroadcastReceiver() { 
List<BluetoothDevice> BtDevices = new ArrayList<BluetoothDevice>(); 
@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    if (action.equals(BluetoothDevice.ACTION_FOUND)) { 

     Log.e(TAG, "--- device found ---"); 

     BluetoothDevice dev = intent 
       .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
     if(!IsBtDevPresent(dev)) { 
      BtDevices.add(dev); 
      if (dev.getBondState() == BluetoothDevice.BOND_BONDED) { 
       availableDevices.add(dev.getName() + " (paired)"); 
      } else { 
       availableDevices.add(dev.getName()); 
      } 
     } 
    } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)){ 

     Log.d(TAG, "DISCOVERY STARTED"); 
     findViewById(R.id.lookup).setVisibility(View.VISIBLE); 

    } 
} 

private boolean IsBtDevPresent(BluetoothDevice dev) { 
    int size = BtDevices.size(); 
    for(int i = 0; i<size; i++) { 
     if(BtDevices.get(i).equals(dev)) { 
      return true; 
     } 
    } 
    return false; 
} 

};

+1

Ihre Antwort ist eine Lösung, stimmt, aber gibt es keine Möglichkeit, den BTAdapter dazu zu bringen, Sendungen nur einmal für jedes Gerät zu senden? Ich fülle ein ArrayAdapter mit diesen Zeichenfolgen, um verfügbare Geräte in einer ListView anzuzeigen. –

0

Eigentlich ICS und größere Geräte senden zwei Broadcasts, eins für Anfrage-Scan und andere für den Seiten-Scan. Deshalb erhalten wir zweimal !!

Aber ich habe den gleichen Code in einem 2.3.5 Gerät getestet, in dem ich nur eine Sendung empfangen erhielt !! Wie kommt es dazu? Welche wir benötigen, individuelle Sendung für Anfrage und Seite oder eine einzige Sendung !! Kann jemand darüber sprechen !!