我正在开发一个应用程序,它可以检测附近的信标,以便用户记录特定的 Action 。我正在使用 AltBeacon 库来执行此操作。当我打开蓝牙时它工作得很好。
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region)
{
Logr.d(TAG, "didRangeBeaconsInRegion size:" + beacons.size());
for (Beacon b : beacons)
{
try
{
String json = (new Gson()).toJson(beaconIdList);
Logr.d(TAG, json, "");
if (b.getId1() == null)
{
continue;
}
if (b.getId2() == null)
{
continue;
}
if (b.getId3() == null)
{
continue;
}
String id1 = b.getId1().toString();
String id2 = b.getId2().toString();
String id3 = b.getId3().toString();
String finalId = id1 + ":" + id2 + ":" + id3;
Integer index = beaconIdList.indexOf(finalId);
if (index >= 0)
{
// index = -1 means that no match
Logr.d(TAG, "beacon matched: " + finalId, "");
}
else
{
Logr.d(TAG, "beacon unmatched: " + finalId + ":" + b.getDistance(), "");
}
}
catch(Exception ex)
{
}
}
}
}
在某些情况下,用户可能会关闭蓝牙。在这种情况下我仍然想记录这个 Action 。引用这个SO answer ,可以在 iOS 上借助位置服务来完成。
Android 也可以这样做吗?
任何建议都会有很大帮助。
最佳答案
这个问题应该很容易回答。如果蓝牙 radio 关闭,它根本无法检测到外部蓝牙 radio 信号,包括信标。该规则受物理定律管辖。
让答案变得更加复杂的是,Android 和 iOS 都以“蓝牙关闭”设置的真正含义来玩游戏。关闭并不真正意味着关闭。更复杂的是,其行为方式因操作系统版本和平台而异。
一般来说,较新版本的 iOS 和 Android 都有两种不同的蓝牙设置:(1) 通过从屏幕顶部向下滑动获得的快速面板设置,以及 (2) 通过转到“设置”获得的完整设置应用程序并深入了解蓝牙。
iOS 11+
Beacon Detection
Setting iBeacon Others* Bluetooth Connections
----------------- ------ -------- ---------------------
Bluetooth On YES YES YES
Quick Setting Off YES NO NO
Full Setting Off NO NO NO
注意:*其他信标类型包括 AltBeacon、Eddystone 等。
搭载 Android 9+ 的 Pixel/三星设备
Setting Beacon Detection Bluetooth Connections
----------------- ---------------- ---------------------
Bluetooth On YES YES
Quick Setting Off* YES NO
Full Setting Off NO NO
注意:* Android 版本 9+ 在位置 -> WiFi 和蓝牙扫描下还有进一步的设置:“允许应用和服务随时扫描附近的设备,即使蓝牙关闭。这可以用于例如改善基于位置的功能和服务。”默认情况下启用此功能,但如果关闭,它会使“快速设置”的行为类似于“完整设置”。
上表适用于 Samsung 和 Pixel 设备。不幸的是,Android 的 fragment 化世界意味着任何 OEM 都能够自定义此行为。 如果您发现廉价 Android 手机或较旧操作系统版本的行为有所不同,请不要感到惊讶。
最后应该注意的是,在 Android 和 iOS 上信标检测都要求:
- 已在设置中启用位置信息
- 用户已向应用授予位置权限
关于android - 即使蓝牙已关闭,也能检测附近的信标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64130653/