即使蓝牙关闭也能检测到附近的信标

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 信标检测要求:

  • 定位功能已在设置中开启
  • 用户已向应用授予位置权限