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



我正在尝试发现我的设备与我在办公室为实习生项目设置的信标之间的距离.我对Android工作室和java仍然很陌生。信标来自苹果(iBeacon(.然而,我只设法找出其中一个信标,即使我打开了五个信标,结果也会重复。我下载了一个应用程序(信标扫描仪( 以确保其他信标已打开.我发现信标确实打开了,但我只能设法找到一个信标,结果重复.如何阻止结果重复并显示其余信标?

以下是我从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");
        }
    });
}

这是我的 device.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.");
      }
    }
  }

以上是一个简单的解决方案,它会告诉您一秒钟内看到的所有信标. 但请记住, 可能不会检测到所有信标的每一秒 它们不经常做广告.您将需要一个更复杂的解决方案来生成在较长时间内看到的所有独特信标的列表.

最新更新