Событие didEnterRegion наступает, когда находится за пределами области маяка - PullRequest
0 голосов
/ 04 февраля 2020

Когда вы находитесь за пределами области маяка, вы иногда вводите 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();
}

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Спасибо за ваш ответ.

Я хочу, чтобы вы рассказали мне еще

startMonitoringBeaconsInRegion или startRangingBeaconsInRegion. Лучше делать removeAllMonitorNotifiers или removeAllRangeNotifiers непосредственно перед выполнением?

Также после остановка.

В примере кода это делается только при подключении услуги. https://altbeacon.github.io/android-beacon-library/samples.html

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

@Override
public void onBeaconServiceConnect() {

    g_beaconManager.removeAllMonitorNotifiers();
    g_beaconManager.removeAllRangeNotifiers();

    g_beaconManager.addMonitorNotifier(new MonitorNotifier() {
        public void didEnterRegion(Region region) {
            Log.d("Beacon", "didEnterRegion Success!!");

            if (g_beaconManager.getRangedRegions().size() == 0) {
                try {
                    g_beaconManager.removeAllRangeNotifiers();
                    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);
                    g_beaconManager.removeAllRangeNotifiers();
                } 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.removeAllRangeNotifiers();
                    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;
                    }
                }
            }
        }
    });
}
0 голосов
/ 04 февраля 2020

Библиотека определяет, что она вышла из региона, не видя видимых пакетов маяка в течение 10 секунд. Эту константу можно переопределить на любое значение, которое вы хотите, вызвав BeaconManager.setRegionExitPeriod(15000); // change to 15 seconds Если вы не позволите мониторингу работать так долго, вы не получите никаких событий выхода из региона.

Библиотека предназначена для вас включите мониторинг и оставьте его включенным на длительный период времени. Отключение после такого короткого периода вызывает проблемы не только из-за выхода из региона, но и из-за частого запуска и остановки сканирования, что является интенсивной операцией, которая может привести к тому, что ОС Android заблокирует последующие сканирования.

...