这个问题可能已经回答了,但我们希望得到明确的确认。
当前,我们在我们的业务中使用专有信标作为iBeacon,我们遇到了大多数人面对的背景扫描问题,我们求助于提供商,他们告诉我们他们知道该问题,但未能做到修复它以进行后台扫描。
我们发现David Young blog post决定尝试一下如何找到两个阻滞剂
我们无法从广播接收器的扫描结果中获取的ScanRecord
数据中获取信标ID(请参见下面的代码)
我们仍然无法在后台连续扫描,并且定期扫描不适用于我们的用例。
ArrayList scanResults = intent.getParcelableArrayListExtra(BluetoothLeScanner.EXTRA_LIST_SCAN_RESULT); ScanRecord record = scanResults.get(0).getScanRecord();
我们找到了解决此问题的方法,方法是使用Google Awareness Fence API触发后台扫描,并使用startForegroundService将负责扫描的服务作为前台服务启动以启动服务,然后调用{{ 3}}在服务实例中显示一个持久性通知,该通知指示我们在“后台”正在执行的操作,这种方法在我们的用例中效果很好,但是如何执行却要花费一定的时间来显示不会创建好的通知用户体验。
我们想知道是否有人找到了解决此问题的更好的方法,因为从google文档来看,后台扫描显然是我们绝对无法做的事情
答案 0 :(得分:2)
您对使用Android 8+进行长期蓝牙扫描的三个选项的摘要基本上是正确的。没有持续的通知,您将无法进行持续的后台扫描。您可以:
默认情况下,开源Android Beacon库在Android 8+上同时使用选项(1)和(2)。当定期扫描处于不活动状态时,它使用基于意图的扫描选项,这实际上使您可以始终检测到新的信标。
目前还不清楚为什么您不能从基于意图的扫描接收到的数据包中解析出标识符,因为上述库已经在多个Android 8设备上成功做到了这一点。也许将过滤器设置为广泛,以便它匹配不包含您期望的标识符的数据包?
您可以从库here中看到有效的代码:
ArrayList<ScanResult> scanResults = intent.getParcelableArrayListExtra(BluetoothLeScanner.EXTRA_LIST_SCAN_RESULT);
上面的代码与您使用的相同。解码发生here。
从第二个链接可以看到,后台检测不仅解析了Intent中的记录,还使库使用JobScheduler安排了一次连续扫描(简短地)。因此,即使由于某种原因您的设备未成功通过基于Intent的扫描成功传递扫描结果,在接收到Intent后使用JobScheduler启动临时扫描的技术也会捕获并解码后续广告,如果信标出现在附近并有规律地传播。