我需要扫描信标何时接近,但我需要的是找到的信标是最近的而不是随机信标。 我尝试了两种方法:
public void onBeaconsUpdated(final Region region, final List<BeaconDevice> beacons) {
for(int i=0; i<beacons.size();i++)
{
beacon = beacons.get(i);
if(beacon.getProximity() != Proximity.UNKNOWN && beacon.getAccuracy() < 4)
{
i = beacons.size() + 1;
}
}//THIS IS THE METHOD I USE TO GET THE NEAREST BEACON FROM THE LIST BUT IT DOESN'T WORK
if(beacon.getMinor() == 1 && beacon.getMinor() != lastBeacon)
{
}
if(beacon.getMinor() == 2 && beacon.getMinor() != lastBeacon)
{
}
if(beacon.getMinor() == 3 && beacon.getMinor() != lastBeacon)
{
}
if(beacon.getMinor() == 4 && beacon.getMinor() != lastBeacon)
{
}
if(beacon.getMinor() == 5 && beacon.getMinor() != lastBeacon)
{
}
//and so on
}
@Override
public void onBeaconAppeared(final Region region, final BeaconDevice beacon) {
}
对于第一种方法,列表不是根据准确性排序的, 在第二种方法中,信标的发现不是基于它们的准确性。 第一种方法是否可以对列表进行排序以获得最近的信标?
编辑:我还有另外一个问题,当我找到一个灯塔时,我想停止监控其他问题,但是调用beaconManager.stopMonitoring();
不起作用,应用程序一直在搜索信标..这是正确的方法吗?
答案 0 :(得分:1)
在BeaconManager的配置部分中,请设置BeaconDevice.DistanceSort,并设置ASC值。
BeaconManager.setDistanceSort(DistanceSort.ASC);
然后,您可以通过指定:
轻松地从列表中检索Beacon实例 ublic void onBeaconsUpdated(final Region region, final List<BeaconDevice> beacons) {
final BeaconDevice beaconDevice = beacons.get(0); // the nearest beacon device.
}
我也看到你对lastBeacon
次要价值和几个主要价值感兴趣。您也可以应用过滤器来处理仅接受具有lastBeacon
次要值和几个主要值的信标的过滤器。您可以使用MinorFilter,MajorFilter和CustomFilter来完成。
如果附近有0个信标,则会调用public void onMonitorStop()
,是否有办法阻止调用此方法并继续扫描?
onMonitorStart()
和onMonitorStop()
都与MonitorPeriod紧密绑定。 MonitorPeriod.getActivePeriod()指定监控的持续时间,MonitorPeriod.getPassivePeriod()表示Android设备在以下两个活动时段之间处于非活动状态的时间。
我发现您对onBeaconsUpdated()
方法感兴趣,因此您可以选择注册RangingListener,因为它提供了单一方法,您可以获得区域和设备列表。
Ranging使用的资源比监控少一点,如果你专注于远程设备而不是进入/放弃的区域,那么它更可取。