是否有停止使用 altbeacon 查找重复信标的功能?

Is there a function to stop finding repeated beacons with altbeacon?

我正在尝试确定我的设备与我在办公室为实习生设置的信标之间的距离 project.I 我对 Android 工作室和 java 还是很陌生.信标来自苹果(iBeacon)。但是我只设法找出其中一个信标,即使我打开了五个信标,结果也会重复。我下载了一个应用程序(Beacon Scanner)以确保其他信标打开 on.I 发现信标确实打开但我只能设法找到一个信标,结果是 repeated.How do i停止重复结果并显示其余信标?

下面是我从 davidgyoung 开发的 Altbeacon 库中得到的代码。

@Override
public void onBeaconServiceConnect() {

    RangeNotifier rangeNotifier = new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
            if (beacons.size() > 0) {
                Log.d(TAG, "didRangeBeaconsInRegion called with beacon count:  "+beacons.size());
                Beacon firstBeacon = beacons.iterator().next();
                logToDisplay("The first beacon " + firstBeacon.toString() + " is about " + String.format("%.2f", firstBeacon.getDistance()) + " meters away.");
            }
        }
    };
    try {
        beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
        beaconManager.addRangeNotifier(rangeNotifier);
        beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
        beaconManager.addRangeNotifier(rangeNotifier);
    } catch (RemoteException e) {   }
}

private void logToDisplay(final String line) {
    runOnUiThread(new Runnable() {
        public void run() {
            EditText editText = (EditText)RangingActivity.this.findViewById(R.id.rangingText);
            editText.append(line+"\n");
        }
    });
}

这是我设备的结果。https://i.stack.imgur.com/zJWs2.jpg

了解回调 didRangeBeaconsInRegion 每秒调用一次,其中包含自上次调用以来检测到的所有信标的列表。您显示的代码只查看第一个信标:

Beacon firstBeacon = beacons.iterator().next();

如果您想处理所有检测到的信标,请使用循环:

   for (Beacon beacon : beacons) {
      logToDisplay("The beacon " + beacon.toString() + " is about " + String.format("%.2f", beacon.getDistance()) + " meters away.");
   }

如果你不想每秒重做一次处理,那么你可以像这样添加一个标志:

 boolean alreadyProcessed = false;
 @Override
  public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
    if (!alreadyProcessed) {
      alreadyProcessed = true;
      for (Beacon beacon : beacons) {
        logToDisplay("The beacon " + beacon.toString() + " is about " + String.format("%.2f", beacon.getDistance()) + " meters away.");
      }
    }
  }

以上是一个简单的解决方案,可以告诉您一秒钟内看到的所有信标。但请记住,所有信标可能不会在不频繁发布广告的每一秒都被检测到。您将需要一个更复杂的解决方案来生成在较长时间内看到的所有唯一信标的列表。