我正在开发一个简单的应用程序,用来扫描BLE设备,然后过滤扫描结果,只找到我的ESP32。我想通过过滤服务UUID来查找我的ESP32。我已经确认我的自定义服务存在于广告数据中(通过在“完整的128位服务UUID列表”中列出该服务的nRF连接)。但是,当我在扫描前将服务UUID过滤器添加为ScanFilter时,我的ScanCallback从未被调用过。但是,我可以删除扫描过滤器,并手动检查该服务是否存在于ScanCallback中。请参见下面的代码示例。
第一个示例使用的是手动过滤,并且运行良好。
private ParcelUuid mServiceUuidFilter = ParcelUuid.fromString("6E400001-B5A3-F393-E0A9-E50E24DCCA9E");
private final ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
boolean matched = (mServiceUuidFilter == null);
if (mServiceUuidFilter != null && result.getScanRecord().getServiceUuids() != null) {
for (ParcelUuid uuid : result.getScanRecord().getServiceUuids()) {
if (uuid.equals(mServiceUuidFilter)) {
matched = true;
break;
}
}
}
if (matched) {
// do something
}
}
};
private void scan() {
List<ScanFilter> scanFilters = new ArrayList<>();
// works
ScanFilter filter = new ScanFilter.Builder().build();
scanFilters.add(filter);
ScanSettings scanSettings = new ScanSettings.Builder().build();
// skipping mScanner initialization
mScanner.startScan(scanFilters, scanSettings, mScanCallback);
}第二个示例使用ScanFilter进行过滤,但不起作用。永远不会调用mScanCallback。
private ParcelUuid mServiceUuidFilter = ParcelUuid.fromString("6E400001-B5A3-F393-E0A9-E50E24DCCA9E");
private final ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
// do something
}
};
private void scan() {
List<ScanFilter> scanFilters = new ArrayList<>();
// does not work
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(mServiceUuidFilter).build();
scanFilters.add(filter);
ScanSettings scanSettings = new ScanSettings.Builder().build();
// skipping mScanner initialization
mScanner.startScan(scanFilters, scanSettings, mScanCallback);
}我是不是漏掉了什么?
发布于 2021-09-20 17:58:17
嗯,我不太确定我更改了什么,但在将我的最低API级别设置为21时,这开始起作用了。
https://stackoverflow.com/questions/69258705
复制相似问题