Има ли функция за спиране на намирането на повтарящи се маяци с altbeacon?

Опитвам се да открия разстоянието между моето устройство и маяците, които съм настроил в офиса си за моя стажантски проект. Все още съм съвсем нов в Android Studios и Java. Маяците са от apple (iBeacon). Въпреки това успях да намеря само един от маяците и резултатите се повтарят, въпреки че имам включени пет маяка. Изтеглих приложение (Beacon Scanner), за да се уверя, че другите маяци са включени. Разбрах, че маяците наистина са включени, но мога да намеря само един маяк и резултатът се повтаря. Как да спра резултата от повтаряне и показване на останалите маяци?

По-долу е кодът, който получих от библиотеката 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 клас и деклариране на публичния статичен окончателен String 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