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。
当信标靠近时我需要扫描,但我需要的是找到的信标是最近的而不是随机的。 我尝试了两种方法:
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。