即使蓝牙关闭也能检测到附近的信标
Detect a nearby beacon even if the Bluetooth is switched off
我正在开发一个应用程序,它可以检测附近的信标,供用户记录某个动作。我正在使用 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)
{
}
}
}
}
在某些情况下,用户可能会关闭蓝牙。在这种情况下,我仍然想记录运动。参考此 SO answer,可以在 iOS 上借助定位服务完成。
Android也可以吗?
任何建议都会有很大帮助。
这个问题应该很容易回答。如果蓝牙无线电关闭,它就无法检测到外部蓝牙无线电信号,包括信标。此规则受物理定律支配。
让答案更复杂的是 Android 和 iOS 玩游戏时“蓝牙关闭”设置的真正含义。关闭并不真正意味着关闭。更复杂的是,其行为方式因操作系统版本和平台而异。
一般来说,iOS 和 Android 的较新版本都有两种不同的蓝牙设置:(1) 从屏幕顶部向下滑动即可获得快速面板设置,以及 (2)通过转到“设置”应用并深入到蓝牙获得的完整设置。
iOS11+
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 等
Pixel/Samsung 设备带 Android 9+
Setting Beacon Detection Bluetooth Connections
----------------- ---------------- ---------------------
Bluetooth On YES YES
Quick Setting Off* YES NO
Full Setting Off NO NO
注意:* Android 版本 9+ 在位置 -> WiFi 和蓝牙扫描下还有一个进一步的设置:“允许应用程序和服务随时扫描附近的设备,即使蓝牙已关闭。例如,这可用于改进 location-based 功能和服务。”这是默认启用的,但如果关闭,它会使快速设置的行为类似于完整设置。
以上 table 适用于 Samsung 和 Pixel 设备。不幸的是,Android 的碎片化世界意味着任何 OEM 都能够自定义此行为。 如果您发现便宜的 Android phone 或更早的 OS 版本表现不同,请不要感到惊讶。
最后需要注意的是 Android 和 iOS 信标检测要求:
- 定位功能已在设置中开启
- 用户已向应用授予位置权限
我正在开发一个应用程序,它可以检测附近的信标,供用户记录某个动作。我正在使用 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)
{
}
}
}
}
在某些情况下,用户可能会关闭蓝牙。在这种情况下,我仍然想记录运动。参考此 SO answer,可以在 iOS 上借助定位服务完成。
Android也可以吗?
任何建议都会有很大帮助。
这个问题应该很容易回答。如果蓝牙无线电关闭,它就无法检测到外部蓝牙无线电信号,包括信标。此规则受物理定律支配。
让答案更复杂的是 Android 和 iOS 玩游戏时“蓝牙关闭”设置的真正含义。关闭并不真正意味着关闭。更复杂的是,其行为方式因操作系统版本和平台而异。
一般来说,iOS 和 Android 的较新版本都有两种不同的蓝牙设置:(1) 从屏幕顶部向下滑动即可获得快速面板设置,以及 (2)通过转到“设置”应用并深入到蓝牙获得的完整设置。
iOS11+
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 等
Pixel/Samsung 设备带 Android 9+
Setting Beacon Detection Bluetooth Connections
----------------- ---------------- ---------------------
Bluetooth On YES YES
Quick Setting Off* YES NO
Full Setting Off NO NO
注意:* Android 版本 9+ 在位置 -> WiFi 和蓝牙扫描下还有一个进一步的设置:“允许应用程序和服务随时扫描附近的设备,即使蓝牙已关闭。例如,这可用于改进 location-based 功能和服务。”这是默认启用的,但如果关闭,它会使快速设置的行为类似于完整设置。
以上 table 适用于 Samsung 和 Pixel 设备。不幸的是,Android 的碎片化世界意味着任何 OEM 都能够自定义此行为。 如果您发现便宜的 Android phone 或更早的 OS 版本表现不同,请不要感到惊讶。
最后需要注意的是 Android 和 iOS 信标检测要求:
- 定位功能已在设置中开启
- 用户已向应用授予位置权限