Как определить регион Enter / Exit для нескольких маяков с использованием Android-маяка AltBeacon?

Я работаю с iBeacons и использую библиотеку AltBeacon.

beaconManager.getBeaconParsers() .add(new BeaconParser() .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 

Я хочу, чтобы мое приложение Android обнаружило и создало событие, когда маяки вошли и выходили из видимости. Это прекрасно работает с одним маяком, используя библиотеку, используя методы.

 public void **didEnterRegion**(Region region) 

а также

 public void **didExitRegion**(Region region) 

Моя проблема заключается в том, что одновременно отображаются несколько маяков. Я пытаюсь сохранить массив со всеми видимыми маяками. Я хочу генерировать событие каждый раз, когда маяк входит и выходит. Событие должно идентифицировать маяк, который сгенерировал событие по его уникальному идентификатору. Мои маяки уникально идентифицируются с помощью beacon.getIdentifiers() или (UUID, Major и Minor)

Проблема в том, что метод didExitRegion не выполняется, пока все маяки не выйдут из региона.

Может ли кто-нибудь подумать о простом способе достижения моих целей с помощью библиотеки AltBeacon?

Любые предложения будут ценны.

Solutions Collecting From Web of "Как определить регион Enter / Exit для нескольких маяков с использованием Android-маяка AltBeacon?"

Два варианта:

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

     Region region1 = new Region("myIdentifier1", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("1")); Region region2 = new Region("myIdentifier2", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("2")); beaconManager.startMonitoringBeaconsInRegion(region1); beaconManager.startMonitoringBeaconsInRegion(region2); 
  2. Включите ранжирование и поместите код в didRangeBeaconsInRegion вызов didRangeBeaconsInRegion для отслеживания отдельных маяков. Вы можете использовать java.util.HashMap чтобы отслеживать все видимые маяки (с отметкой времени в последний раз, когда каждый был замечен), а затем, если вы не видели маячок, скажем, пять секунд, вы можете Удалите маяк из HashMap и выполните логику выхода для этого маяка.

Вариант 1 отлично подходит для небольшого количества маяков, где вы знаете их идентификаторы спереди. Вариант 2 более активен, но лучше для большого количества маяков или если вы заранее не знаете их идентификаторы.

/ *************** Этот код для оценки маяков ***************** /

 private final Region ALL_ESTIMOTE_BEACONS_REGION = new Region("beaconall", null, null, null); private BeaconManager beaconManager; public onCreate() { beaconManager.connect(new BeaconManager.ServiceReadyCallback() { @Override public void onServiceReady() { Log.d("Lalit", "Beacon service Ready"); beaconManager.startRanging(ALL_ESTIMOTE_BEACONS_REGION); beaconManager.startMonitoring(ALL_ESTIMOTE_BEACONS_REGION); } }); beaconManager.setRangingListener(new BeaconManager.RangingListener() { @Override public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) { int index = beacons.size(); // UUID uuid = UUID.fromString(""); if (beacons.size() > 0) { Beacon SelectedBeacon = beacons.get(index-1); Log.d("Lalit", "Beacon Id :- " + SelectedBeacon.getProximityUUID()); Log.d("Lalit", "Beacon major :- " + SelectedBeacon.getMajor()); Log.d("Lalit", "Beacon miner :- " + SelectedBeacon.getMinor()); Log.d("Lalit", "Beacon total :- " + beacons.size()); Log.d("Lalit","Distance :- "+ getDistance(SelectedBeacon.getRssi(),SelectedBeacon.getMeasuredPower())); } } }); beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener() { @Override public void onEnteredRegion(Region region, List<Beacon> list) { Calendar calendar = Calendar.getInstance(); Date entertime = calendar.getTime(); Log.d("Lalit", "Region Enter :- " + entertime); Log.d("List", "Region UUID id :- " + region.getProximityUUID()); } @Override public void onExitedRegion(Region region) { Calendar calendar = Calendar.getInstance(); Date entertime = calendar.getTime(); Log.d("Lalit", "Region exit :- " + entertime); Log.d("List", "Region UUID id :- " + region.getProximityUUID()); } }); }