您如何检测 iBeacon 发射器何时关闭?安卓

Posted

技术标签:

【中文标题】您如何检测 iBeacon 发射器何时关闭?安卓【英文标题】:how do you detect when your iBeacon transmitter is turned off? Android 【发布时间】:2015-12-16 03:19:52 【问题描述】:

我有显示 iBeacon 信息(例如 uuid、major、minor 等)的 TextViews 和一个 Detect/Stop 按钮来开始/停止扫描 BLE。当我在 iBeacon 关闭时按下按钮开始扫描时,应用程序没有按预期显示任何内容。但是,当我在打开 iBeacon 时开始扫描,然后在扫描时关闭 iBeacon,应用程序仍然显示信息,就好像它仍在检测 iBeacon。当应用程序在信标打开时扫描 BLE 时,它会给出

D/BluetoothAdapter: onScanResult() - Device=(我的设备号) RSSI=-49

在 Logcat 中。当我在扫描时关闭信标时,它会给出

D/BluetoothAdapter: startLeScan(): null

D/BluetoothAdapter:onClientRegistered() - status=0 clientIf=4.

有什么方法可以检测到 iBeacon 是否已使用 LeScanCallback 或其他任何东西关闭?我已经尝试从 android iBeacon Library 学习如何做到这一点,但我仍然不知道。

提前致谢。

【问题讨论】:

【参考方案1】:

不可能确定信标发射器是否已关闭 - 您所能做的就是说 您在某个时间段内没有收到它的消息,这在功能上是等效的 为您的目的

这听起来像是学术上的区别,但事实并非如此 - 对同一范围内相同信标的两部手机进行并排比较时,检测率可能非常高,从检测之间的数秒到每次检测的多次检测第二个。

无论您决定使用什么未听到的间隔,请务必在各种手机上进行测试。

不用说,鉴于“关闭”的含义缺乏任何通用定义,因此没有事件回调。

【讨论】:

这是正确的。而在使用 Android Beacon 库时,didExitRegion 回调是在合理的时间段内(默认约 6 秒)未检测到信标时得到的回调。 我检查了收到最近一次回调的时间,并将其与当前时间进行了比较。它工作得很好。非常感谢!【参考方案2】:

您使用的是哪个 Android API 级别?如果您使用的是 Android Marshmallow 及更高版本,则可以使用ScanSettings.CALLBACK_TYPE_MATCH_LOST。如果您根据匹配过滤器发现的设备不在范围内,这将向您发送回调ScanCallback#onScanResult(int callbackType, ScanResult result)。换句话说,输了。

否则,您可以在课堂中包含 HashMap<String,Timer> 字段(String 用于 Mac 地址)。每次收到广告数据包时相应地更新一个标志,以便在时间到时检查设备是否在范围内。如果在范围内,则启动另一个计时器。否则,它会丢失。

【讨论】:

我的应用程序的targetAPI 是23,但我正在使用API​​ 18 在手机上测试我的应用程序。当我在MainActivity 类中将scanCallback 声明为private 时,会出现NoClassDefFoundError。我认为这是因为不支持scanCallback 功能的手机的API 级别较低。所以,我尝试在OnCreate 中实现scanCallback,但没有成功。无论如何,您的 HashMap 解决方案运行良好。非常感谢! 很高兴您成功实施了 HashMap 解决方案。您可以单击以接受此答案作为您问题的解决方案。

以上是关于您如何检测 iBeacon 发射器何时关闭?安卓的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Native 中检测键盘何时打开或关闭

如何让 Ibeacon 设备可以检测到其他设备

我们可以在后台启动一个 iBeacon 发射器吗?

iBeacon - 可以使用 startRangingBeacons 进行检测,但不能用于 didEnterRegion

IOS:手机锁定时iBeacon扫描频率?

如何在不知道 UUID、任何可能获得核心蓝牙或其他方式的情况下检测 iBeacons