首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务UUID上的BluetoothLeScanner ScanFilter不起作用

服务UUID上的BluetoothLeScanner ScanFilter不起作用
EN

Stack Overflow用户
提问于 2021-09-20 17:39:54
回答 1查看 164关注 0票数 1

我正在开发一个简单的应用程序,用来扫描BLE设备,然后过滤扫描结果,只找到我的ESP32。我想通过过滤服务UUID来查找我的ESP32。我已经确认我的自定义服务存在于广告数据中(通过在“完整的128位服务UUID列表”中列出该服务的nRF连接)。但是,当我在扫描前将服务UUID过滤器添加为ScanFilter时,我的ScanCallback从未被调用过。但是,我可以删除扫描过滤器,并手动检查该服务是否存在于ScanCallback中。请参见下面的代码示例。

第一个示例使用的是手动过滤,并且运行良好。

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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);
}

我是不是漏掉了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-09-20 17:58:17

嗯,我不太确定我更改了什么,但在将我的最低API级别设置为21时,这开始起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69258705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档