您如何检测 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 发射器何时关闭?安卓的主要内容,如果未能解决你的问题,请参考以下文章
iBeacon - 可以使用 startRangingBeacons 进行检测,但不能用于 didEnterRegion