Мониторинг перезапуска библиотеки Android Beacon, динамические регионы

Прежде всего, извините мой английский, если вы найдете какие-то ошибки, и спасибо за вашу помощь. У меня есть программа, использующая службу API REST для получения списка регионов для мониторинга каждые X секунд. Я использую Android Beacon Library для мониторинга регионов, и я хочу иметь возможность прекратить мониторинг этих регионов, получить новый список, а затем начать мониторинг новых регионов. У меня есть этот код (упрощенный) до сих пор:

public class MainActivity extends Activity implements BeaconConsumer {
  // Code
  Timer task = new TimerTask() {
    @Override
    public void run() {
      handler.post(new rRunnable() {
        @Override
        public void run() {
          new MyAsyncTask().execute(some_params);
        }
      });
    }
  }

  @Override
  protected void onCreate(Buncle savedInstanceState) {
    // Code
    beaconManager = BeaconManager.getInstanceForApplication(this);
    // Set parsers (iBeacon, Eddystone-UID, Eddystone-URL)
    beaconManager.bind(this);
    Log.i(TAG, "Using Android Beacon Library version: "+ org.altbeacon.beacon.BuildConfig.VERSION_NAME);
  }

  @Override
  public void onBeaconServiceConnect() {
    @Override
    public void didEnterRegion(Region region) {
      // Get info of regions and show a list of regions detected on UI
      Log.i(TAG, "Inside of: " + region.toString());
    }

    @Override
    public void didExitRegion(Region region) {
      // Get info of regions and show a list of regions detected on UI
      Log.i(TAG, "Outside of: " + region.toString());
    }

    @Override
    public void didDetermineStateForRegion(int state, Region region) {
      Log.i(TAG, "State: " + state);
    }

    // execute async task to stop monitoring, get new regions list and then
    // start monitoring again
    timer.schedule(task, 0, 30000); 
  }

  private class MyAsyncTask extends AyncTask<String, Void, List<Region>> {
    @Override
    protected List<Region> doInBackground(String... params) {
      // Get list of regions from server
    }

    @Override
    protected void onPostExecute(List<Region> result) {
      // For loop to stop monitoring all regions
      for (Region region : beaconManager.getMonitoredRegions()) {
        try {
          beaconManager.stopMonitoringBeaconsInRegion(region);
          Log.i(TAG, "Stop monitoring: " + region.toString());
        } catch (RemoteException e) { }
      }
      Log.i(TAG, "Nº of regions: " + beaconManager.getMonitoredRegions().size());
      // For loop to start monitoring new regions
      for (Region region : result) {
        try {
          beaconManager.startMonitoringBeaconsInRegion(region);
          Log.i(TAG, "Start monitoring: " + region.toString());
        } catch (RemoteException e) { }
      }
      Log.i(TAG, "Nº of regions: " + beaconManager.getMonitoredRegions().size());
    }
  }

В коде нет синтаксической ошибки, и приложение не вылетает. Когда я запускаю приложение, оно вызывает сервер, получает список регионов для мониторинга, а затем начинает мониторинг регионов. Затем на экране появляется список контролируемых регионов, когда маяки находятся в радиусе действия. На данный момент все кажется в порядке. Затем приложение перестает отслеживать регионы, запрашивает новый список регионов и начинает отслеживать новые. Я попробовал с 3 регионами в первый раз и с 2 во второй раз, и приложение зарегистрировало, что оно начало отслеживать 3 региона, затем прекратило отслеживать эти 3, а затем начало отслеживать 2 новых. Вроде бы все в порядке, но, несмотря на то, что оно говорит, что оно начало отслеживать новые регионы, приложение больше никогда не показывает отслеживаемые регионы на экране, когда маяки находятся в пределах досягаемости.

Я хочу знать, связана ли проблема с тем, как я установил процесс получения регионов и их мониторинга.

Похоже, что после перезапуска мониторинга с новыми регионами не срабатывает didEnterRegion и didExitRegion.

РЕДАКТИРОВАТЬ: я тестирую пример с 3 маяками и 3 регионами. Первый маяк использует iBeacon, второй использует Eddystone-UID, а третий использует Eddystone-URL. Каждый регион настроен на обнаружение одного конкретного маяка.

Logcat (упрощенно, идентификаторы маяков и регионов указаны правильно):

Using Android Beacon Library version: 2.7
Nº of regions: 0
Start monitoring: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor
Start monitoring: id1: eddystone_namespace id2: eddystone_id id3: null
Start monitoring: id1: eddystone_url id2: null id3: null
Nº of regions: 3
State: 1
Inside of: id1: eddystone_url id2: null id3: null
State: 1
Inside of: id1: eddystone_namespace id2: eddystone_id id3: null
State: 1
Inside of: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor

30 seconds later (more or less)...
I have not changed the regions provided by the server.

Stop monitoring: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor
Stop monitoring: id1: eddystone_namespace id2: eddystone_id id3: null
Stop monitoring: id1: eddystone_url id2: null id3: null
Nº of regions: 0
Start monitoring: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor
Start monitoring: id1: eddystone_namespace id2: eddystone_id id3: null
Start monitoring: id1: eddystone_url id2: null id3: null
Nº of regions: 3

30 seconds later (more or less)...

Stop monitoring: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor
Stop monitoring: id1: eddystone_namespace id2: eddystone_id id3: null
Stop monitoring: id1: eddystone_url id2: null id3: null
Nº of regions: 0
Start monitoring: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor
Start monitoring: id1: eddystone_namespace id2: eddystone_id id3: null
Start monitoring: id1: eddystone_url id2: null id3: null
Nº of regions: 3

Keep repeating...

Как мы видим, события didEnterRegion, didExitRegion и didDetermineStateForRegion больше не срабатывают.


person Elo    schedule 06.04.2016    source источник
comment
Можете ли вы подтвердить, какую версию библиотеки вы используете? Log.d(TAG, "Using Android Beacon Library version: "+org.altbeacon.beacon.BuildConfig.VERSION_NAME); Можете ли вы добавить в метод, перезапускающий регионы мониторинга, операторы журнала, показывающие регионы для вызовов stopMonitoringBeaconsInRegion и startMonitoringBeaconsInRegion, а затем прикрепить выходные данные оператора журнала к своему вопросу? Также было бы полезно знать идентификаторы маяков, которые вы передаете, которые не обеспечивают события входа в регион.   -  person davidgyoung    schedule 06.04.2016
comment
Я добавил информацию журнала и сделал код более понятным.   -  person Elo    schedule 08.04.2016
comment
Кстати, я тестировал приложение, используя другие приложения для обнаружения маяков (но не одновременно с тестом выше), например, Locate, Beacon Manager или Estimote, и когда я выполняю некоторые из них одновременно, в конце концов ни один из маяков не обнаружил, пока я не оставил сканирование только одного из них. Это нормальное поведение?   -  person Elo    schedule 08.04.2016
comment
Это на заднем или на переднем плане? Если вы подождете 10 минут, у вас по-прежнему не будет событий входа/выхода? Может быть полезно включить полное ведение журнала отладки и записывать его в LogCat в течение примерно 5 минут. Он будет большим, так что вы можете сослаться на него как на Pastebin или Gist. Вы можете включить ведение журнала отладки с помощью beaconManager.setDebug(true)   -  person davidgyoung    schedule 08.04.2016
comment
Это на переднем плане. Вот журнал gist.github.com/Elolawyn/ffc71c9f5fec7b0f34c40c078dd8fa3b   -  person Elo    schedule 11.04.2016


Ответы (1)


В версии 2.7 в Android Beacon Library обнаружена не обнаруженная (до сих пор) ошибка, которая остановил сканирование на устройствах Android 5+ после остановки сканирования во всех регионах. Сканирование не начиналось снова без отвязки от службы и повторной привязки к ней.

При включенном ведении журнала отладки это выглядело так:

04-11 08:35:07.655  D/BeaconService: stopMonitoring called
04-11 08:35:07.655  D/BeaconService: Currently monitoring 0 regions.
04-11 08:35:07.655  D/CycledLeScanner: stop called
04-11 08:35:07.655  D/CycledLeScanner: disabling scan
...
04-11 08:35:07.663  D/BeaconService: Currently monitoring 1 regions.
04-11 08:35:07.663  D/CycledLeScanner: start called
04-11 08:35:07.663  D/CycledLeScanner: scanning already started

Изменения в том, как это работает, были внесены в выпуск 2.8, и я убедился, что ошибка больше не существует в версии 2.8. В версии 2.8 вторая половина выглядит так:

04-12 18:15:07.623  D/BeaconService: Currently monitoring 1 regions.
04-12 18:13:06.938  D/CycledLeScanner: start called
04-12 18:13:06.938  D/CycledLeScanner: starting a new scan cycle
04-12 18:13:06.939  D/CycledLeScanner: starting a new bluetooth le scan

С 2.8 вы можете остановить мониторинг всех регионов, начать мониторинг нового региона, и вы сразу же получите обратный вызов входа, если маяк находится поблизости. Простое решение — обновиться до версии 2.8 либо через JCenter, либо напрямую загрузив здесь. .

person davidgyoung    schedule 12.04.2016
comment
Я обновил библиотеку, не меняя код, и теперь вроде работает нормально. В журнале написано: I/BeaconService: остановить полученный мониторинг и I/BeaconService: начать мониторинг, полученный впоследствии. Есть только небольшая проблема: теперь он вообще не определяет маяки xD. Идентификатор маяков в порядке, и другие приложения могут найти маяки. - person Elo; 13.04.2016
comment
Одно из изменений в версии 2.8 заключается в том, что библиотека запоминает состояние отслеживаемых регионов при перезапуске приложения. Поэтому, если вы остановите приложение и перезапустите его, когда маяк все еще передает, вы не получите дополнительный обратный вызов didEnterRegion. Это может быть то, что вы видите. Попробуйте выключить маяк, дождаться выхода и снова включить его, чтобы получить событие входа. - person davidgyoung; 13.04.2016
comment
Я использую спящий режим Estimote, и приложение не определяет, покидаю ли я регионы или въезжаю в них. - person Elo; 13.04.2016
comment
Я не уверен, что понимаю. Вы говорите, что не можете получать события выхода из региона, когда маяк перестает передавать или мобильное устройство покидает зону? - person davidgyoung; 13.04.2016