我最近做了一个项目,从我在你的问题中读到的内容与我所做的有些相似。
我知道我可以持续扫描它,但电池使用量太高了,我希望即使在我的应用程序没有被使用时也能调用它。
关于电池问题,一直开蓝牙是很耗电的,但同时不开蓝牙也检测不到BLE。
我做的是两个实验,两个都很有用,但又不同,我不能说哪一个最好,但你需要测试它以符合你的要求。
让 Thread 以编程方式打开蓝牙并监听 iBeacon 和关闭(有睡眠时间)。它可以通过多种方式完成。
-
使用一个名为 Altbeacon 的包,它有很多有用的功能,其中一个功能是使用 example code 自动省电:
public class MyApplication extends Application implements BootstrapNotifier {
private BackgroundPowerSaver backgroundPowerSaver;
public void onCreate() {
super.onCreate();
// Simply constructing this class and holding a reference to it
// in your custom Application class
// enables auto battery saving of about 60%
backgroundPowerSaver = new BackgroundPowerSaver(this);
}
}
我们需要一个广播事件,它会在具有特定 Service-UUID 的 BLE 设备到达时唤醒我们的应用程序。也许现在有比 2 年前更好的 BLE API 可用。最节能最精准的方法获得奖励。
你的另一部分,叫做在特定距离触发动作。
我仍然使用 Altbeacon 来检查信标范围和触发动作。 sample code 类似于
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
for (Beacon beacon : beacons) {
if (beacon.getDistance() < 5.0) {
Log.d(TAG, "I see a beacon that is less than 5 meters away.");
// Perform distance-specific action here
}
}
}
也就是说,你还可以获取特定 UUID 的距离我构建了一个基于 Altbeacon 的方法,如下所示(查看 for 循环和 if 语句内部):
private void startRangeNotifier() {
Log.i(TAG, "Starting range notifier...");
beaconManager.setRangeNotifier(new BeaconRangeListener() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
for (Beacon beacon : beacons) {
Log.d(TAG, "uuid's: " + beacon);
Log.d(TAG, "uuid id1: " + beacon.getId1());
if (beacon.getId1().toString()
.equals("b9407f30-f5f8-466e-aff9-25556b57fe6d")) {
Log.d(TAG, "uuid id1 distance: " + beacon.getDistance());
}
}
}
}
});
try {
beaconManager.startRangingBeaconsInRegion(
new Region(BEACON_MONITORING_ID, null, null, null));
} catch (RemoteException e) {
e.printStackTrace();
}
}
我的日志输出:
D/Main activity:: uuid's: id1: b9407f30-f5f8-466e-aff9-25556b57fe6d id2: 31807 id3: 59251
D/Main activity:: uuid id1: b9407f30-f5f8-466e-aff9-25556b57fe6d
D/Main activity:: uuid id1 distance: 0.2108658568686884
在我的回答中,我想介绍我使用的概念,Beacons 项目通常需要耐心。正如另一个答案所提到的,也可以将此处的解决方案与地理围栏和 ActivityRecognition 结合起来。
注意:由于蓝牙信标的性质,距离是接近而不是绝对的,有时甚至蓝牙信标是 1 米,它可能显示 2 米或 0.5 米,所以请记住这一点
链接参考: