我正在使用iBeacons并使用AltBeacon库。
beaconManager.getBeaconParsers()
.add(new BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
我希望我的Android应用能够在信标进入和退出可见性时检测并生成事件。 使用方法使用库时,单个信标可以很好地工作。
public void **didEnterRegion**(Region region)
和
public void **didExitRegion**(Region region)
我的问题是当多个信标同时可见时。
我试图维护一个所有信标可见的数组。
我想在每次信标进入和退出时生成一个事件。
该事件应通过其唯一标识符识别生成事件的信标。
我的信标可以使用beacon.getIdentifiers()
或(UUID,Major和Minor)
问题是在所有信标退出该区域之前,didExitRegion
方法才会执行。
有人能想到一种简单的方法让我使用AltBeacon库实现我的目标吗?
任何建议都将不胜感激。
答案 0 :(得分:23)
两个选项:
设置一个不同的区域,仅匹配每个单独的信标,指定所有标识符,并监视每个信标。您将获得每个区域的不同进入和退出回调。
Region region1 = new Region("myIdentifier1", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("1"));
Region region2 = new Region("myIdentifier2", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("2"));
beaconManager.startMonitoringBeaconsInRegion(region1);
beaconManager.startMonitoringBeaconsInRegion(region2);
启用范围,并将代码放入didRangeBeaconsInRegion
回调中以跟踪各个信标。您可以使用java.util.HashMap
来跟踪所有可见的信标(每个信号都显示最新时间的时间戳),然后如果您还没有看到信标,例如五秒钟,您可以从HashMap
移除信标并执行该信标的退出逻辑。
选项1非常适合您预先知道其标识符的少数信标。选项2涉及更多,但对于大量信标或者如果您事先不知道它们的标识符则更好。
答案 1 :(得分:1)
/ ***************此守则用于估计信标***************** /
private final Region ALL_ESTIMOTE_BEACONS_REGION = new Region("beaconall", null, null, null);
private BeaconManager beaconManager;
public onCreate()
{
beaconManager.connect(new BeaconManager.ServiceReadyCallback()
{
@Override
public void onServiceReady()
{
Log.d("Lalit", "Beacon service Ready");
beaconManager.startRanging(ALL_ESTIMOTE_BEACONS_REGION);
beaconManager.startMonitoring(ALL_ESTIMOTE_BEACONS_REGION);
}
});
beaconManager.setRangingListener(new BeaconManager.RangingListener() {
@Override
public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) {
int index = beacons.size();
// UUID uuid = UUID.fromString("");
if (beacons.size() > 0) {
Beacon SelectedBeacon = beacons.get(index-1);
Log.d("Lalit", "Beacon Id :- " + SelectedBeacon.getProximityUUID());
Log.d("Lalit", "Beacon major :- " + SelectedBeacon.getMajor());
Log.d("Lalit", "Beacon miner :- " + SelectedBeacon.getMinor());
Log.d("Lalit", "Beacon total :- " + beacons.size());
Log.d("Lalit","Distance :- "+ getDistance(SelectedBeacon.getRssi(),SelectedBeacon.getMeasuredPower()));
}
}
});
beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener() {
@Override
public void onEnteredRegion(Region region, List<Beacon> list) {
Calendar calendar = Calendar.getInstance();
Date entertime = calendar.getTime();
Log.d("Lalit", "Region Enter :- " + entertime);
Log.d("List", "Region UUID id :- " + region.getProximityUUID());
}
@Override
public void onExitedRegion(Region region) {
Calendar calendar = Calendar.getInstance();
Date entertime = calendar.getTime();
Log.d("Lalit", "Region exit :- " + entertime);
Log.d("List", "Region UUID id :- " + region.getProximityUUID());
}
});
}