android - android 9 上的过滤扫描不会使用 UUID 过滤器找到信标
问题描述
我目前正在尝试扫描 BLE 设备,我使用的是带有 android 9.0 的 Galaxy S9+。似乎未过滤的扫描不适用于galaxy s9 +,所以我添加了这样的过滤器
String serviceUuidString = "51525354-5556-5758-5950-abbccddeeff0"; //uuid i wanna scan
String serviceUuidMaskString = "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF";
ParcelUuid parcelUuid = ParcelUuid.fromString(serviceUuidString);
ParcelUuid parcelUuidMask = ParcelUuid.fromString(serviceUuidMaskString);
ScanFilter filter1 = new ScanFilter.Builder().setServiceUuid(parcelUuid, parcelUuidMask).build();
filters.add(filter1);
这没有用,但只要我添加了这个
ScanFilter filter = new ScanFilter.Builder().setDeviceAddress("D8:09:1A:58:41:39").build();
filters.add(filter);
它在手机锁定后开始检测信标。不过,我不认为添加每个 Mac 都是一个好方法。为 uuid 添加过滤器时是否做错了什么?
这就是我建立设置的方式
settings = scanSettingsBuilder.build();
解决方案
仔细检查以绝对确定您的服务 UUID 在过滤器中是正确的。当检测到服务广告数据包(没有过滤器)并在此处发布时,从操作系统打印出 LogCat 行可能会有所帮助。
值得一提的是,Android Beacon 库中存在非常相似的代码,可以使用以下代码在后台扫描 Eddystone 服务 UUID,并且我已经验证它可以在 Galaxy S9 上运行(尽管还没有在 Android 9.0 上运行)。下面的代码与您所拥有的主要区别在于它将 16 位 UUID 格式化为 128 位 UUID。但我认为这不太可能有所作为。
ScanFilter.Builder builder = new ScanFilter.Builder();
String serviceUuidString = String.format("0000%04X-0000-1000-8000-00805f9b34fb", sfd.serviceUuid);
String serviceUuidMaskString = "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF";
ParcelUuid parcelUuid = ParcelUuid.fromString(serviceUuidString);
ParcelUuid parcelUuidMask = ParcelUuid.fromString(serviceUuidMaskString);
builder.setServiceUuid(parcelUuid, parcelUuidMask);
ScanFilter scanFilter = builder.build();
scanFilters.add(scanFilter);
推荐阅读
- angularjs - AngularJS $localstorage 在其他选项卡中不起作用
- docker - /bin/sh: 1: sudo: 运行 dockerfile 时找不到
- html - 如何使用连接到容器的向下箭头创建渐变 css
- android - 多语言不适用于日期选择器 Android
- c - C: 不能从 2 个管道文件描述符中读取而不会丢失另一个
- c# - 如何动态克服列表对象的foreach循环
- javascript - 避免使用嵌套循环来查找数组的最大子字符串?
- javascript - Fabric JS + Gif图像动画不起作用
- ember.js - 在 ember 中访问控制器功能中的控制器属性
- git - 如何从 git remote 永久撤消最近的提交,但将其保存在我的本地?