2015-11-20 2 views
0

Я интегрирую API AltBeacon в существующее приложение. Приложение должно начинать действия на фоне , когда пользователь вводит или покидает «зону Bluetooth».Использование AltBeacon: запуск и остановка сканирования из настроек приложения

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

I судимого связывает/отвязать BeaconConsumer, но я увидел, что на заднем BluetoothLeScanner держит сканирование! Как остановить сканирование BluetoothLeScanner? Правильно ли это?

Вот код:

@Override 
    public void onCreate() { 
     super.onCreate(); 
     LogManager.setVerboseLoggingEnabled(true); 
     log.debug("onCreate"); 
     mAllBeaconsRegion = new Region(ALLBEACONS, null, null, null); 
     mBeaconManager = BeaconManager.getInstanceForApplication(this); 
     mBackgroundPowerSaver = new BackgroundPowerSaver(this); 
     mBeaconManager.setBackgroundBetweenScanPeriod(60000L); 
     mBeaconManager.setBackgroundScanPeriod(2100L); 
     // wake up the app when a beacon is seen 
     mRegionBootstrap = new RegionBootstrap(this, mAllBeaconsRegion); 
     mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25")); 
     dsGlobal = new DbGlobalsHelper(getApplicationContext()); 
     boolean isBeaconScan = Utils.isBoolean(dsGlobal.getCursorGlobalsByKey(Constants.DB_KEY_BEACON_SCAN)); 
     if(isBeaconScan){ 
      mBeaconManager.bind(this); 
     }else{ 
      mBeaconManager.unbind(this); 
     } 
    } 

    // Set Regions to monitor at boot/startup 
    private void setRegionsAtBoot(){ 
     Log.i(TAG, "setRegionsAtBoot"); 
     log.info("setRegionsAtBoot"); 
     SimpleBeaconStore beaconStore = new SimpleBeaconStore(this); 
     List<SimpleBeacon> beacons = beaconStore.getBeacons(); 
     for (Iterator<SimpleBeacon> iterator = beacons.iterator(); iterator.hasNext();) { 
      SimpleBeacon simpleBeacon = iterator.next(); 
      List<Identifier> listB = new ArrayList<Identifier>(); 
      StringTokenizer st = new StringTokenizer(simpleBeacon.getBeaconUuid(), "#"); 
      while (st.hasMoreTokens()) { 
       listB.add(new Identifier(Identifier.parse(st.nextToken()))); 
      } 
      try { 
       Log.i(TAG, "setRegionsAtBoot " + simpleBeacon.getId()); 
       log.info("setRegionsAtBoot " + simpleBeacon.getId()); 
       Region region = new Region(simpleBeacon.getId(), listB); 
       mBeaconManager.startRangingBeaconsInRegion(region); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
     // Start actions 
     if (region.getUniqueId().equals(ALLBEACONS)){ 
      return; 
     } 
     if (beacons.size() > 0) { 
      for (Beacon beacon: beacons) { 
       Log.d(TAG, "Beacon "+beacon.toString()+" is about "+beacon.getDistance()+" meters away, with Rssi: "+beacon.getRssi()); 
       log.debug("Beacon " + beacon.toString() + " is about " + beacon.getDistance() + " meters away, with Rssi: " + beacon.getRssi()); 

       datasource = new DbZoneHelper(getApplicationContext()); 
       ZoneEntity ze = datasource.getCursorZoneByName(region.getUniqueId()); 

       if (beacon.getDistance() < ze.getRadius() && !ze.isStatus()) { 
        // 
        Log.i(TAG, "Beacon " + beacon.toString() + " Just became less than " + ze.getRadius() + " meters away."); 
        log.info("*** Beacon " + beacon.toString() + " Just became less than " + ze.getRadius() + " meters away. ***"); 
        String transitionType = getTransitionString(1); 
        NotificationUtil.sendNotification(getApplicationContext(), transitionType, region.getUniqueId()); 
        worker = new Worker(getApplicationContext()); 
        worker.handleTransition(1, region.getUniqueId(), Constants.BEACON); 

       } 
       if (beacon.getDistance() > (ze.getRadius() * EXITMULTIPLICATOR) && ze.isStatus()) { 
        // 
        Log.i(TAG, "Beacon "+ beacon.toString()+" Just became over " + ze.getRadius() * EXITMULTIPLICATOR + " meters away."); 
        log.info("*** Beacon " + beacon.toString() + " Just became over " + ze.getRadius() * EXITMULTIPLICATOR + " meters away. ***"); 
        String transitionType = getTransitionString(2); 
        NotificationUtil.sendNotification(getApplicationContext(), transitionType, region.getUniqueId()); 

        worker = new Worker(getApplicationContext()); 
        // 
        worker.handleTransition(2, region.getUniqueId(), Constants.BEACON); 

       } 
      } 
     } 
    } 

    @Override 
    public void didDetermineStateForRegion(int arg0, Region arg1) { 
    } 

    @Override 
    public void didEnterRegion(Region region) { 

    } 

    @Override 
    public void didExitRegion(Region region) { 

     if (region.getUniqueId().equals(ALLBEACONS)){ 
      return; 
     } 

     datasource = new DbZoneHelper(getApplicationContext()); 
     ZoneEntity ze = datasource.getCursorZoneByName(region.getUniqueId()); 

     if (ze.isStatus()) { 
      // 
      Log.i(TAG, "Beacon " + region.getUniqueId() + " Just exited region."); 
      log.info("Beacon " + region.getUniqueId() + " Just exited region."); 
      String transitionType = getTransitionString(2); 
      NotificationUtil.sendNotification(getApplicationContext(), transitionType, region.getUniqueId()); 

      worker = new Worker(getApplicationContext()); 

      worker.handleTransition(2, region.getUniqueId(), Constants.BEACON); 
     } 
    } 

    @Override 
    public void onBeaconServiceConnect() { 
     Log.d(TAG, "onBeaconServiceConnect."); 
     log.debug("onBeaconServiceConnect"); 
     setRegionsAtBoot(); 
     mBeaconManager.setRangeNotifier(this); 
    } 

    public void bind(){ 
     mBeaconManager.bind(this); 
    } 

    public void unbind(){ 
     mBeaconManager.unbind(this); 
    } 

Я также призываю привязку/отвязать от моих настроек.

+0

Можете ли вы разместить свой код, в том числе, где вы начинаете ранжирование или мониторинг, и где вы связываете или отвязываете? – davidgyoung

+0

@davidgyoung: Я обновил свой вопрос и добавил код. – egmontr

ответ

1

В показанном коде используется класс RegionBootstrap для непрерывного сканирования маяков в фоновом режиме. Этот класс по существу предназначен для того, чтобы никогда не прекращать сканирование маяков. RegionBootstrap связывается со службой сканирования при построении и эффективно никогда не отсоединяет. Таким образом, код, который вручную связывает и отвязывает, не имеет никакого эффекта.

Если вы хотите, чтобы начать и остановить сканирование в разное время, то не использовать RegionBootstrap класс, и вместо того, чтобы сделать свой Application или Activity осуществлять BeaconConsumer и привязку/отвязать, как описано в примере мониторинга кода здесь: http://altbeacon.github.io/android-beacon-library/samples.html

+0

Это не решение, так как приложение должно сканировать в фоновом режиме и без него, что кажется невозможным. – egmontr

+1

Это правда, что если вы используете «RegionBootstrap» для начала сканирования в фоновом режиме, тогда нет простого способа отвязать службу. Вы можете попробовать вызвать beaconManager.stopRangingBeaconsInRegion (...) 'и передать тот же регион, который вы использовали с' RegionBootstrap'. Это должно прекратить сканирование без развязки. – davidgyoung

+0

Да, это решающий ответ! Сейчас он работает, как и ожидалось. – egmontr