2012-02-27 2 views
8

Я хочу слушать соединение/разъединение с некоторыми конкретными устройствами Bluetooth, чьи MAC-адреса я знаю, но которые не обязательно сопряжены (я не хочу связываться с списком спаренных устройств пользователя и наоборот). Меня интересует только их присутствие, а не общение с ними.Как определить устройство *, которое Bluetooth-устройство вызывает трансляцию ACTION_ACL_CONNECTED?

Это очень хорошо работает с моим кодом ниже! Но моя проблема в том, что я не могу узнать, какое конкретное устройство подключается/отключается, только то, что это происходит с кем-то из них. Как я могу узнать, к какому действию относится это действие?

Сначала я конкретизации объектов для моих двух конкретных физических устройств блютуз и добавить их в намерениях фильтра:

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); 

Тогда я слушаю для передач о них:

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

Теперь я хочу найти который был подключен и/или отключен, и я не вижу, как я могу это сделать.

Либо 1) Я напрямую использую «BluetoothDevice». Он реагирует на трансляцию в порядке, но это не говорит мне, какой из двух физических устройств имеет действие. Их способ узнать? Bluetooth.getName() не допускается, потому что это не статический класс.

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

или 2) Я слушаю оба действия для обоих устройств.

 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 "); 

Но затем он записывает, что он соединяется с myPinkHeadset даже если это myPvBluetoothDongle я активировать физически. Он всегда идет на тот, который приходит первым из тестов if. Он заботится только о самом действии, а не о том, к какому объекту он относится.

Я видел, что EXTRA_DEVICE «используется в качестве дополнительного дополнительного поля BluetoothDevice в каждом намерении, транслируемом этим классом». Но это только возвращает нуль ко мне:

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

ответ

14

Это дает устройство, подключенное к:

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

Как новичок, я неправильно понял parcelable концепцию. EXTRA_DEVICE - это String, но это всего лишь тег для объекта. Поэтому нет необходимости регистрировать или прослушивать отдельные экземпляры BluetoothDevice. Когда действие транслируется, намерение укажет, какое физическое устройство вызвало его. (Могу ли я +1 к себе для этого :-D)

+0

сделал ту же ошибку с аргументацией, Строка сбивает с толку – NikkyD

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

и

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

имеют одинаковое значение. Это статическое значение. BluetoothDevice.ACTION_ACL_CONNECTED и 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; 
     } 
    } 
} 

};

Я надеюсь, что это может вам помочь

Смежные вопросы