Android 4.3中添加了Bluetooth LE,但似乎没有后台扫描模式,以便当应用程序注册要接收来自附近可用BLE UUID的通知时唤醒它。
iOS7和iBeacons API恰好可以实现此功能。是否有人知道Android 4.3中是否存在这样的功能,或者是否有一个良好的解决方案可以周期性地扫描BLE设备?
http://developer.android.com/guide/topics/connectivity/bluetooth-le.html
Android 4.3中添加了Bluetooth LE,但似乎没有后台扫描模式,以便当应用程序注册要接收来自附近可用BLE UUID的通知时唤醒它。
iOS7和iBeacons API恰好可以实现此功能。是否有人知道Android 4.3中是否存在这样的功能,或者是否有一个良好的解决方案可以周期性地扫描BLE设备?
http://developer.android.com/guide/topics/connectivity/bluetooth-le.html
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();
}
根据我的经验,最好创建一个保持运行的服务。重要的是只扫描您感兴趣的信标,否则您将浪费大量的CPU功率来解析信标消息。
这个库可以帮助您仅扫描您感兴趣的iBeacon:https://github.com/inthepocket/ibeacon-scanner-android
此外,当无法进行扫描时(由于蓝牙关闭、位置关闭、权限被撤销),您必须在满足所有必要条件后重新启动扫描,因此您需要广播侦听器。
能够进行扫描的条件:
拥有蓝牙LE芯片:任何。
开启蓝牙:任何。
开启位置:Android 6+。
具有位置运行时权限:Android 6+。
在30秒内最多启动5次扫描:Android 7+。
BluetoothAdapter.getDefaultAdapter().getRemoteDevice("20:00:A0:60:DD:05");
)。但只有在开始扫描时才能连接。目前似乎没有后台扫描功能,或许以后会加入。 - OneWorld