安卓BLE信标扫描

14

Android 4.3中添加了Bluetooth LE,但似乎没有后台扫描模式,以便当应用程序注册要接收来自附近可用BLE UUID的通知时唤醒它。

iOS7和iBeacons API恰好可以实现此功能。是否有人知道Android 4.3中是否存在这样的功能,或者是否有一个良好的解决方案可以周期性地扫描BLE设备?

http://developer.android.com/guide/topics/connectivity/bluetooth-le.html

http://techcrunch.com/2013/09/11/estimote-details-ios-7-ibeacon-support-for-its-contextual-proximity-shopping-devices/

3个回答

10
我认为以下是一个解决方法: 您需要实现一个服务并创建线程来while循环调用mBluetoothAdapter.startLeScan(mLeScanCallback),然后您可以检查是否被特定设备触发并进一步搜索特定UUID。

我即将实现这个功能。但是,我不会运行一个连续的服务,而是可能创建一个广播接收器,并每隔1分钟唤醒它。在Google Play服务正式添加地理围栏之前,我曾经使用过这种方法。显然,这种方法的问题在于信息/扫描不能在应用程序之间共享,效率也会降低。但应该可以工作。 - Sven Haiges
4
您的建议可以在某些情况下使用,但更多地是一种天真的实现方式。这种方法的问题肯定会是功耗。请注意BLE文档页面上的这行文字:“要查找BLE设备,您可以使用startLeScan()方法。该方法将BluetoothAdapter.LeScanCallback作为参数。您必须实现此回调,因为这就是扫描结果返回的方式。由于扫描会消耗电池电量...” 我认为可能有更好的方法来解决这个问题,比如注册系统级事件,就像在位置围栏API中一样。 - Igor Čordaš
5
提醒文档指出这会耗电,点赞。你也可以连接到未收到广告的设备并将autoConnect设置为“true”(可以像这样创建BluetoothDevice:BluetoothAdapter.getDefaultAdapter().getRemoteDevice("20:00:A0:60:DD:05");)。但只有在开始扫描时才能连接。目前似乎没有后台扫描功能,或许以后会加入。 - OneWorld

1
直接从Android示例中,您可以使用一个处理程序:
private void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                    invalidateOptionsMenu();
                }
            }, SCAN_PERIOD);

            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
        invalidateOptionsMenu();
    }

你知道吗,也许我可以用这段代码检测iBeacons,还是需要额外的库? - EugenSunic

0

根据我的经验,最好创建一个保持运行的服务。重要的是只扫描您感兴趣的信标,否则您将浪费大量的CPU功率来解析信标消息。

这个库可以帮助您仅扫描您感兴趣的iBeacon:https://github.com/inthepocket/ibeacon-scanner-android

此外,当无法进行扫描时(由于蓝牙关闭、位置关闭、权限被撤销),您必须在满足所有必要条件后重新启动扫描,因此您需要广播侦听器。

能够进行扫描的条件:

  • 拥有蓝牙LE芯片:任何。

  • 开启蓝牙:任何。

  • 开启位置:Android 6+。

  • 具有位置运行时权限:Android 6+。

  • 在30秒内最多启动5次扫描:Android 7+。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接