2012-02-27 14 views
8

Chcę słuchać połączenia/rozłączenia z wieloma konkretnymi urządzeniami bluetooth, których adresy MAC znam, ale które niekoniecznie są sparowane (nie chcę zepsuć listy sparowanych urządzeń użytkownika i na odwrót). Interesuje mnie tylko odkrywanie ich obecności, nie komunikowanie się z nimi.Jak rozpoznać * jakie * urządzenie Bluetooth powoduje transmisję ACTION_ACL_CONNECTED?

Działa to bardzo dobrze z mojego kodu poniżej! Ale moim problemem jest to, że nie mogę się dowiedzieć, które konkretne urządzenie łączy/rozłącza, tylko że zdarza się komuś z nich. Jak mogę się dowiedzieć, które działanie dotyczy?

Najpierw wystąpień obiektów dla moich dwóch konkretnych fizycznych urządzeń Bluetooth i dodać je do mojego zamiarem filtr:

BluetoothDevice myPinkHeadset = mBluetoothAdapter.getRemoteDevice("18:17:0C:EB:9C:81"); 
    BluetoothDevice myPcBluetoothDongle = mBluetoothAdapter.getRemoteDevice("5A:7A:CC:4B:C5:08"); 

    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction(myPinkHeadset.ACTION_ACL_CONNECTED); 
    intentFilter.addAction(myPinkHeadset.ACTION_ACL_DISCONNECTED); 
    intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_CONNECTED); 
    intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_DISCONNECTED); 

Potem słuchać do audycji o nich:

final BroadcastReceiver intentReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

Teraz chcę znaleźć który został podłączony i/lub odłączony i nie widzę, jak mogę to zrobić.

Albo 1) Używam "BluetoothDevice" bezpośrednio. Reaguje na transmisję w porządku, ale nie mówi mi, które z dwóch fizycznych urządzeń dotyczy. Czy jest to sposób na odkrycie? Funkcja Bluetooth.getName() nie jest dozwolona, ​​ponieważ nie jest klasą statyczną.

if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { 
     } 

lub 2) Słucham obu akcji dla obu urządzeń.

 if (myPinkHeadset .ACTION_ACL_CONNECTED.equals(action)) { 
      Log.v(TAG, "Connected to myPinkHeadset "); 
     } 
     else if (myPinkHeadset .ACTION_ACL_DISCONNECTED.equals(action)) { 
      Log.v(TAG, "Disconnected from myPinkHeadset "); 
     } 
     else if (myPcBluetoothDongle .ACTION_ACL_CONNECTED.equals(action)) { 
      Log.v(TAG, "Connected to myPcBluetoothDongle "); 
     } 
     else if (myPcBluetoothDongle .ACTION_ACL_DISCONNECTED.equals(action)) { 
      Log.v(TAG, "Disconnected from myPcBluetoothDongle "); 

Ale to rejestruje, że łączy się z myPinkHeadset nawet jeśli jest myPvBluetoothDongle aktywować fizycznie. Zawsze odnosi się do tego, który pojawia się jako pierwszy z testów if. Dba tylko o samą akcję, a nie o przedmiot, którego dotyczy.

Zauważyłem, że EXTRA_DEVICE jest "Używane jako dodatkowe pole BluetoothDevice w każdym celu emisji przez tę klasę." Ale to tylko zwraca null do mnie:

String extra = intent.getStringExtra(BluetoothDevice.EXTRA_DEVICE); 

Odpowiedz

14

Daje to urządzenie podłączone do:

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

Jako początkujących, ja źle się parcelable koncepcji. EXTRA_DEVICE jest ciągiem, ale jest po prostu tagiem dla obiektu. Nie ma więc potrzeby rejestrowania ani słuchania poszczególnych wystąpień BluetoothDevice. Kiedy akcja jest transmitowana, intencja określa, które urządzenie fizyczne ją spowodowało. (+1 mogę sobie tego :-D)

+0

zrobił ten sam błąd z paragonem, String jest mylące – NikkyD

1
intentFilter.addAction(myPinkHeadset.ACTION_ACL_CONNECTED); 
intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_CONNECTED); 

i

intentFilter.addAction(myPinkHeadset.ACTION_ACL_DISCONNECTED); 
intentFilter.addAction(myPcBluetoothDongle.ACTION_ACL_DISCONNECTED); 

są tej samej wartości. Jest to wartość statyczna. BluetoothDevice.ACTION_ACL_CONNECTED i BluetoothDeviceACTION_ACL_DISCONNECTED

private void register() { 
    context.registerReceiver(bluetoothBroadCast, new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED)); 
    context.registerReceiver(bluetoothBroadCast, new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED)); 
} 

private final BroadcastReceiver bluetoothBroadCast = new BroadcastReceiver() { 
@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    switch (action) { 
     case BluetoothDevice.ACTION_ACL_CONNECTED: { 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      if(device.getAddress().equals(myPinkHeadset.getAddress)) { 
       //Do what you want 
      } 
      break; 
     } 

     case BluetoothDevice.ACTION_ACL_DISCONNECTED: { 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      break; 
     } 
    } 
} 

};

Mam nadzieję, że to może ci pomóc

Powiązane problemy