2015-03-05 3 views
1

Я пишу пользовательский класс Android-приложения, в котором используется Android-Beacon-Library от AltBeacon.AltBeacon: onBeaconServiceConnect не вызывается, когда BeaconConsumer привязан от DidEnterRegion BootstrapNotifier callback

Вместо публикации класса я воспроизвожу проблему с использованием эталонных образцов реализации, поставляемых с библиотекой.

Если я активирую как мониторинг (путем внедрения RegionBootstrap), так и диапазон beaconManager.bind (новый BeaconConsumer() ...) непосредственно в onCreate(), все работает отлично.

Я хотел бы, однако, чтобы начать начиная только тогда, когда маяк входит в область, поэтому в didEnterRegion (область arg0) обратного вызова из RegionBootstrap, но когда я делаю так, onBeaconServiceConnect() никогда не вызывается. Я считаю, что делать это таким образом было бы более эффективным с точки зрения потребления батареи.

Я попытался выполнить симуляцию на основном потоке, а также использовать задержанные таймеры, но это не сработало.

Любой может заставить это работать? Любая помощь ценится!

public class BeaconReferenceApplication extends Application implements BootstrapNotifier { 

    private static final String TAG = "AndroidProximityReferenceApplication"; 
    private RegionBootstrap regionBootstrap; 
    private BackgroundPowerSaver backgroundPowerSaver; 
    BeaconManager beaconManager; 
    Context context = this; 

    public void onCreate() { 
     super.onCreate(); 
     beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this); 
     // Setup beacon layout - should be done once only 
     List<BeaconParser> bp = beaconManager.getBeaconParsers(); 
     bp.add(new BeaconParser().setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24")); 

     Region region = new Region("backgroundRegion", null, null, null); 
     regionBootstrap = new RegionBootstrap(this, region); 
     backgroundPowerSaver = new BackgroundPowerSaver(this); 

     // THIS WORKS 
     bindBeaconConsumer(); 
    } 

    public void bindBeaconConsumer() { 
     beaconManager.bind(new BeaconConsumer() { 
      @Override 
      public void onBeaconServiceConnect() { 
       // ISSUE : Does not pass here when bindBeaconConsumer() is called from didEnterRegion 

       // Set Range Notifier and start ranging 
      } 

      @Override 
      public Context getApplicationContext() { 
       return context; 
      } 

      @Override 
      public void unbindService(ServiceConnection serviceConnection) { 
       context.unbindService(serviceConnection); 
      } 

      @Override 
      public boolean bindService(Intent intent, ServiceConnection serviceConnection, int i) { 
       return context.bindService(intent, serviceConnection, i); 
      } 
     }); 
    } 

    @Override 
    public void didEnterRegion(Region arg0) { 
     Log.d(TAG, "did enter region."); 

     // THIS DOESN'T WORK : onBeaconServiceConnect() never called 
     // bindBeaconConsumer(); 
    } 

    @Override 
    public void didExitRegion(Region region) { 
    } 

    @Override 
    public void didDetermineStateForRegion(int state, Region region) { 
    } 
} 

ответ

2

Причина вызова bindBeaconConsumer() не работает в обратном вызове мониторинга происходит потому, что к тому времени он выполняет, класс уже привязан к службе. Если вы посмотрите на LogCat, вы увидите предупреждающее сообщение об этом. Поскольку он уже связан, код не получает обратный вызов до onBeaconServiceConnect().

Почему это уже связано? Из приведенной ниже строки:

regionBootstrap = new RegionBootstrap(this, region); 

RegionBootsrap класс делает операцию связывания за кадром, который выполняет в секунду или около того.

Самый простой способ исправить это - удалить вызов bindBeaconConsumer() в методе didEnterRegion и вместо этого просто позвонить beaconManager.startRangingBeaconsInRegion(...). Вам не нужно связывать снова, потому что к этому моменту служба уже привязана.