BoundService中的AltBeacon库扫描不会在unbind()上停止-Android O

时间:2019-07-03 21:48:48

标签: android kotlin bluetooth-lowenergy altbeacon

我正在尝试扫描信标,然后一旦找到信标,便开始从手机上发布GATT服务器。问题是扫描似乎没有正确停止,然后中断了我与连接到GATT服务器的设备的连接。

我尝试做的第一件事是使用

停止并解除我的BeaconScannerService的绑定。
beaconManager.unbind(this)

onUnbind()和OnStopService()内部。

在此操作无效后,我尝试在找到我的信标后立即解除扫描仪的绑定:

override fun didRangeBeaconsInRegion(beacons: Collection<Beacon>, region: Region) {
        if (beacons.isNotEmpty()) {
            for (beacon in beacons) {
                if (!listOfBeacons.contains(beacon)) {
                    listOfBeacons.add(beacon)
                    sendNotificationFound()
                    localIntent.putExtra("BT_Address", beacon.bluetoothAddress)
                    localIntent.putExtra("Is_Connected", true)
                    LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent)
                    Log.e("BEACON", "FOUND ONE " + beacon.bluetoothAddress)
                }
            }
            Log.e(TAG, "Stopping Service")
            beaconManager.stopRangingBeaconsInRegion(region)
            beaconManager.removeAllRangeNotifiers()
            beaconManager.stopMonitoringBeaconsInRegion(region)
            beaconManager.removeAllMonitorNotifiers()
            beaconManager.unbind(this)
            beaconManager.isBound(this)
            stopSelf()
        }
    }

我还启用了BeaconManager的调试选项,但是发生了太多事情,我不知道会有什么帮助。

最后,我希望能够在发现信标之后完全摆脱所有信标扫描。

1 个答案:

答案 0 :(得分:0)

有几点要澄清这里发生的事情:

  • 有两种方法可以使用Android Beacon库在Android 8+上进行背景检测:由JobScheduler发起的扫描(默认)和IntentService(仅当您调用以禁用默认设置时-通常在与前台服务结合使用。
  • 使用JobScheduler时,扫描会在操作系统允许的情况下大约每15分钟在后台运行一次,并执行低延迟BLE扫描以查找所有可见的信标。
  • 在15分钟的作业之间,如果看不到任何信标,则库还将设置基于意图的扫描,以唤醒库(和您的应用程序)以在出现任何信标时进行额外的扫描。如果没有范围或监视区域,则不会开始此扫描。如果开始,它将在下一个作业的开始处停止。
  • 日志行“通过意图获取Android O后台扫描”是指从上述点的扫描类型获取结果。

我怀疑在某些情况下,某些库竞争情况可能会使此基于意图的扫描保持打开状态。可能会解决以下问题:不调用unbind(),而是像您一样停止量程和监视。

如果这不起作用,那么如果您附上从尝试停止服务到发现“通过意图获取Android O后台扫描”之类的日志摘录,我可能可以帮助您进行跟踪问题。 (也请让我知道您使用的库版本号。)

最后,我要补充的是,如果将扫描真正保留为“然后中断与连接到GATT服务器的设备的连接”,我会感到惊讶。您可能会发现这不是该问题的根本原因。