Как определить регион 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?
Приветствуются любые предложения.
Ответы
Ответ 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);
-
Включить ранжирование и поместить код в обратный вызов didRangeBeaconsInRegion
для отслеживания отдельных маяков. Вы можете использовать java.util.HashMap
для отслеживания всех видимых маяков (с отметкой времени в последний раз, когда каждый был замечен), а затем, если вы не видели маячок, скажем, пять секунд, вы можете удалить маяк от HashMap
и выполните логику выхода для этого маяка.
Вариант 1 отлично подходит для небольшого количества маяков, где вы знаете свои идентификаторы спереди. Вариант 2 более активен, но лучше для большого количества маяков или если вы заранее не знаете их идентификаторы.
Ответ 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());
}
});
}