Есть ли функция, чтобы остановить поиск повторяющихся маяков с помощью altbeacon?

Я пытаюсь определить расстояние между моим устройством и маяками, которые я установил в своем офисе для своего стажерского проекта. Я все еще новичок в студиях Android и java. Маяки от Apple (iBeacon). Однако мне удалось найти только один из маяков, и результаты повторяются, хотя у меня включено пять маяков. Я загрузил приложение (сканер маяков), чтобы убедиться, что другие маяки включены. Я обнаружил, что маяки действительно включены, но мне удается найти только один маяк, и результат повторяется. Как мне остановить результат от повторять и показывать остальные маяки?

Ниже приведен код, который я получил из библиотеки Altbeacon, разработанной davidgyoung.

@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


person Loon    schedule 26.07.2019    source источник


Ответы (1)


Имейте в виду, что обратный вызов 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.");
      }
    }
  }

Выше приведено простое решение, которое сообщает вам обо всех маяках, увиденных за одну секунду. Но имейте в виду, что все маяки могут не обнаруживаться каждую секунду, если они не часто рекламируются. Вам понадобится более сложное решение для создания списка всех уникальных маяков, которые вы видели за более длительный период времени.

person davidgyoung    schedule 26.07.2019
comment
Спасибо @davidgyoung! Приведенное выше решение решило мою проблему. На данный момент я могу обнаружить все маяки, но есть некоторые маяки, которые я хочу отфильтровать с помощью UUID. Делаю ли я что-то вроде создания нового класса Java и объявления общедоступной статической окончательной строки UUID = UUID, который я хочу? - person Loon; 29.07.2019
comment
Просто замените эту new Region("myRangingUniqueId", null, null, null) на аналогичную строку, содержащую UUID, который вы хотите обнаружить, например, new Region("myRangingUniqueId", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), null, null) - person davidgyoung; 29.07.2019
comment
Оно работает! Спасибо за ваше время, помогая мне с проблемами, с которыми я столкнулся, очень ценю это! - person Loon; 02.08.2019