蓝牙LE扫描滤镜无法正常工作

我想在我的Android代码中只扫描具有特定UUID的BLE信标。 即使我可以为特定的MAC地址添加filter,我也无法使用UUID。 永远不会调用onScanResult函数。 为什么会这样? 我正在使用API​​ 21,我没有收到任何项目错误。

final String tagUUID = "01122334-4556-6778-899a-abbccddeeff0"; //does not work ScanFilter filter = new ScanFilter.Builder().setServiceUuid(new ParcelUuid(UUID.fromString(tagUUID))).build(); //works ScanFilter filter = new ScanFilter.Builder().setDeviceAddress(tagMAC).build(); 

我是上面提到的博客文章的作者。 以下是解决Android 21+问题的方法。

 // Empty data byte[] manData = new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // Data Mask byte[] mask = new byte[]{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; // Copy UUID into data array and remove all "-" System.arraycopy(hexStringToByteArray("YOUR_UUID_TO_FILTER".replace("-","")), 0, manData, 2, 16); // Add data array to filters ScanFilter filter = new ScanFilter.Builder().setManufacturerData(76, manData, mask).build()); public static byte[] hexStringToByteArray(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); } return data; } 

这里的问题是你可以添加UUID过滤但不完全直截了当

过滤可能在“服务UUID”ADtypes广告结构中查找服务UUID。 这实际上是有道理的,它应该如何运作。

对于信标,您尝试查找的UUID实际上位于“制造商特定数据”ADtypes结构中。 并且没有人关心在那里寻找服务UUID

我认为服务UUID过滤仅用于过滤GATT数据库中的 UUID 服务 ; 如我在第一段中所解释的那样,将find那些UUID。

信标中的UUID本身不是服务UUID。 它是具有UUID格式的信标标识符。