Kontakt beacon 如何根据准确性检索信标

Kontakt beacon how to retrieve beacon based on accuracy

当信标靠近时我需要扫描,但我需要的是找到的信标是最近的而不是随机的。 我尝试了两种方法:

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(); 不起作用并且应用程序一直在搜索信标..这是正确的方法吗?

在BeaconManager的配置部分,请设置BeaconDevice.DistanceSort, with 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. The MonitorPeriod.getActivePeriod() specifies how long monitoring lasts and MonitorPeriod.getPassivePeriod() 告诉 Android 设备在接下来的 2 个活动周期之间处于非活动状态的时间。

我看到您主要对 onBeaconsUpdated() 方法感兴趣,因此您也可以注册 RangingListener,因为它提供了获取区域和设备列表的单一方法。

测距比监控占用的资源少一些,如果您专注于远程设备而不是区域,则更可取entering/abandoning。