我想在Android M中构建我的扫描设置,以便在一个ScanCallback
对象中为三个不同的事件获得单独的回调:
当远程设备首次匹配过滤器时
当Android手机在第一次发现后收到广告时(在这种情况下,我正在检查广告数据是否已更改)
当远程设备超出范围时
API中有三个选项:
CALLBACK_TYPE_ALL_MATCHES CALLBACK_TYPE_FIRST_MATCH CALLBACK_TYPE_MATCH_LOST
遗憾的是,没有一个关于这三个选项是否可以一起使用的良好文档.根据我的实验,我应该只选择其中一个.API是否离我们需要分开同时进行扫描,以获取回调CALLBACK_TYPE_ALL_MATCHES
,并CALLBACK_TYPE_MATCH_LOST
在同一时间?有没有人对如何使用这些选项有任何好的经验?
编辑:
检查API源代码后,我发现这CALLBACK_TYPE_FIRST_MATCH | CALLBACK_TYPE_MATCH_LOST
也是一个有效的组合.然而,CALLBACK_TYPE_FIRST_MATCH
与之相比,使用它会使发现明显变慢(~30秒)CALLBACK_TYPE_ALL_MATCHES
.此外,CALLBACK_TYPE_MATCH_LOST
尽管该设备正在积极地进行广告宣传.我不认为这个API是可靠的.
这是我的结果:
12:02:50.179 31627-31655 D/BluetoothLeScanner:onClientRegistered() - status = 0 clientIf = 6
12:03:24.877 31627-31627 D/ScanCallbackMarshmallow:ScanResult {mDevice = E8:A8:C9:82:17:61, ...}
12:03:24.878 31627-31627 D/ScanCallbackMarshmallow:CALLBACK_TYPE_FIRST_MATCH
12:03:29.905 31627-31627 D/ScanCallbackMarshmallow:ScanResult {mDevice = C0:B6:43:1E:45:28,...}
12 :03:29.906 31627-31627 D/ScanCallbackMarshmallow:CALLBACK_TYPE_FIRST_MATCH
12:03:39.721 31627-31627 D/ScanCallbackMarshmallow:ScanResult {mDevice = D8:35:26:9D:55:B4,...}
12:03:39.722 31627 -31627 D/ScanCallbackMarshmallow:CALLBACK_TYPE_FIRST_MATCH12:04:21.889 718-730 D/BluetoothLeScanner:onClientRegistered() - status = 0 clientIf = 6 12:04:22.073 718-718 D/ScanCallbackMarshmallow:ScanResult {mDevice = D8:35:26:9D:55:B4, ...} 12:04:22.073 718-718 D/ScanCallbackMarshmallow:CALLBACK_TYPE_ALL_MATCHES 12:04:22.316 718-718 D/ScanCallbackMarshmallow:ScanResult {mDevice = E8:A8:C9:82:17:61,...} 12 :04:22.316 718-718 D/ScanCallbackMarshmallow:CALLBACK_TYPE_ALL_MATCHES 12:04:24.740 718-718 D/ScanCallbackMarshmallow:ScanResult {mDevice = E8:A8:C9:82:17:61,...} 12:04:24.740 718 -718 D/ScanCallbackMarshmallow:CALLBACK_TYPE_ALL_MATCHES
编辑2:
将扫描模式设置为ScanSettings.SCAN_MODE_LOW_LATENCY
使用CALLBACK_TYPE_FIRST_MATCH
尽可能快的发现CALLBACK_TYPE_ALL_MATCHES
.但是,如果我设置回调类型,因为ScanSettings.CALLBACK_TYPE_FIRST_MATCH | ScanSettings.CALLBACK_TYPE_MATCH_LOST
如果广告数据是动态的,我将无法检查广告数据是否已经改变.我认为这是API的问题.应该注意,广告数据是不可预测的,因此我不能基于其内容过滤广告数据.