android - 即使蓝牙已关闭,也能检测附近的信标

标签 android bluetooth bluetooth-lowenergy beacon altbeacon

我正在开发一个应用程序,它可以检测附近的信标,以便用户记录特定的 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/

相关文章:

Android Bitmap原生API创建android.graphics.Bitmap实例

android - HTML5 数据列表标签在 android 中不起作用

android - 如何使用 Android 4+ 确认文件已通过蓝牙成功发送

c# - 如何从运行在 Windows 10 Creators Update 上的 WPF 应用注册 BLE 通知?

java - viewpager2 中的无限滚动

android - fragment 仅在应用程序设计为在手机和平​​板电脑上运行时才有用吗?

android - Android 中的自定义蓝牙协议(protocol)支持

安卓蓝牙配对

linux - 我如何从返回字节数组的 dbus bluez api 中提取任何有用的信息

swift - BLE 在蓝牙设备附近执行功能