在Android 8+上进行后台扫描

时间:2018-12-26 23:56:46

标签: android altbeacon ibeacon-android

这个问题可能已经回答了,但我们希望得到明确的确认。

当前,我们在我们的业务中使用专有信标作为iBeacon,我们遇到了大多数人面对的背景扫描问题,我们求助于提供商,他们告诉我们他们知道该问题,但未能做到修复它以进行后台扫描。

我们发现David Young blog post决定尝试一下如何找到两个阻滞剂

  1. 我们无法从广播接收器的扫描结果中获取的ScanRecord数据中获取信标ID(请参见下面的代码)

  2. 我们仍然无法在后台连续扫描,并且定期扫描不适用于我们的用例。

    ArrayList scanResults = intent.getParcelableArrayListExtra(BluetoothLeScanner.EXTRA_LIST_SCAN_RESULT); ScanRecord record = scanResults.get(0).getScanRecord();

我们找到了解决此问题的方法,方法是使用Google Awareness Fence API触发后台扫描,并使用startForegroundService将负责扫描的服务作为前台服务启动以启动服务,然后调用{{ 3}}在服务实例中显示一个持久性通知,该通知指示我们在“后台”正在执行的操作,这种方法在我们的用例中效果很好,但是如何执行却要花费一定的时间来显示不会创建好的通知用户体验。

我们想知道是否有人找到了解决此问题的更好的方法,因为从google文档来看,后台扫描显然是我们绝对无法做的事情

1 个答案:

答案 0 :(得分:2)

您对使用Android 8+进行长期蓝牙扫描的三个选项的摘要基本上是正确的。没有持续的通知,您将无法进行持续的后台扫描。您可以:

  1. 使用JobScheduler进行定期扫描。您每15分钟最多可以扫描10分钟。
  2. 运行一个前台服务,该服务可以使持续不断的扫描持续进行,但是会以持久性通知的形式向用户表明您的应用程序处于活动状态并且正在使用电池。
  3. 使用基于意图的扫描来始终在蓝牙广告中寻找字节模式。这仅适用于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启动临时扫描的技术也会捕获并解码后续广告,如果信标出现在附近并有规律地传播。