Когда вы находитесь за пределами области маяка, вы иногда вводите didEnterRegion.
Иногда не вводите didEnterRegion, когда находитесь в области маяка. Это длится долго.
Терминал Fujitsu arrow M03. Android ™ 6.0
Вы можете получить информацию о маяке с помощью didRangeBeaconsInRegion, когда находитесь в didEnterRegion.
Активность используется службой переднего плана.
BeaconManager используется как передний план в этом сервисе.
Экран выключен. Однако wakeLock получен в службе.
Интервал сканирования маяка составляет 4 секунды. setForegroundBetweenScanPeriod (4000);
Мониторинг выключен / включен с 10-секундными интервалами.
никогда не вводите didExitRegion. Я думаю, что для входа необходимо включить мониторинг более чем на 10 секунд.
Нужно ли надежно генерировать didExitRegion?
Лучше не включать / выключать мониторинг каждые 10 секунд ? ON всегда лучше?
Настройки обнаружения маяка
g_beaconManager = BeaconManager.getInstanceForApplication(this);
g_beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
g_beaconManager.bind(this);
g_beaconManager.setForegroundBetweenScanPeriod(4000);
g_region = new Region("iBeacon", null, null, null);
BeaconManager Services
@Override
public void onBeaconServiceConnect() {
g_beaconManager.addMonitorNotifier(new MonitorNotifier() {
public void didEnterRegion(Region region) {
Log.d("Beacon", "didEnterRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didExitRegion(Region region) {
Log.d("Beacon", "didExitRegion Success!!");
if (g_beaconManager.getRangedRegions().size() != 0) {
try {
g_beaconManager.stopRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
Log.d("Beacon", "didDetermineStateForRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
try {
g_beaconManager.startMonitoringBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
g_beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region) {
Beacon lBeacon_Most_Near_Distance = null;
Log.d("Beacon" , "addRangeNotifier Success!!");
for (Beacon beacon : Beacons) {
if (lBeacon_Most_Near_Distance == null)
{
lBeacon_Most_Near_Distance = beacon;
}
else
{
if (lBeacon_Most_Near_Distance.getDistance() > beacon.getDistance())
{
lBeacon_Most_Near_Distance = beacon;
}
}
}
}
});
}
Мониторинг ВЫКЛ / ВКЛ каждые 10 секунд
try {
if (g_beaconManager.getRangedRegions().size() != 0) {
g_beaconManager.stopRangingBeaconsInRegion(g_region);
}
if (g_beaconManager.getMonitoredRegions().size() != 0) {
g_beaconManager.stopMonitoringBeaconsInRegion(g_region);
} else {
g_beaconManager.startMonitoringBeaconsInRegion(g_region);
}
} catch (RemoteException e) {
e.printStackTrace();
}