如何识别哪个*蓝牙设备导致ACTION_ACL_CONNECTED广播?

我想听一些特定的蓝牙设备的连接/断开,这些设备的MAC地址是我知道的,但不一定是配对的(我不想惹恼用户的配对设备列表,反之亦然)。 我只感兴趣的是发现他们的存在,而不是与他们沟通。

这与我的代码在下面工作得很好! 但我的问题是,我无法找出哪个特定的设备连接/断开,只是发生在他们中的某个人。 我怎样才能找出行动涉及哪一个?

首先我为我的两个特定物理蓝牙设备实例化对象,并将它们添加到我的意图filter中:

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

但是,然后它logging它连接myPinkHeadset,即使它是myPvBluetoothDongle我物理激活。 它总是去那个如果testing的第一个。 它只关心行动本身,而不关心行为。

我看到EXTRA_DEVICE被“用作这个类所传播的每一个意图的一个Parcelable BluetoothDevice额外的字段”。 但它只对我返回null:

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

Solutions Collecting From Web of "如何识别哪个*蓝牙设备导致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; } } } 

};

我希望这可以帮助你