Как определить, какое Bluetooth-устройство вызывает ACTION_ACL_CONNECTED?

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

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

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

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 в каждом намерении, транслируемом этим классом». Но он возвращает мне только null:

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

Solutions Collecting From Web of "Как определить, какое Bluetooth-устройство вызывает ACTION_ACL_CONNECTED?"

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

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

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

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

};

Я надеюсь это тебе поможет