2016-05-21 12 views
0

Когда я запускаю приложение, запускается сканирование и функция onBeaconServiceConnect() запускается через 2-3 секунды. Мне нужно увеличить его. Также я использую фоновый маяк, сканирующий другой класс. И я использую другой объект beaconManager. Хотя я использую функцию setForegroundBetweenScanPeriod(), чтобы сделать это, он не работает. Функция onBeaconServiceConnect() забивается через 2-3 секунды. Как я могу это решить? Мои функции, как показано ниже:Невозможно увеличить период сканирования маяка. Библиотека Altbeacon

------------------------ Мой основной класс для обнаружения маяков на переднем плане -------- --------------

private void generateBeaconOptions() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      final AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setTitle("This app needs location acces"); 
      builder.setMessage("Please grat location acces so this app can detect beacons"); 
      builder.setPositiveButton(android.R.string.ok, null); 

      builder.setOnDismissListener(new DialogInterface.OnDismissListener() { 
       @Override 
       public void onDismiss(DialogInterface dialogInterface) { 
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION); 
       } 
      }); 
     } 
    } 
    beaconManager = BeaconManager.getInstanceForApplication(this); 
    beaconManager.getBeaconParsers().clear(); 
    beaconManager.getBeaconParsers().add(new BeaconParser(). 
      setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25")); 

    region = new Region("com.example.myapp.boostrapRegion", null, null, null); 
    beaconManager.setForegroundScanPeriod(1100l); 
    beaconManager.setForegroundBetweenScanPeriod(30000l); 
    beaconManager.bind(this); 
} 

@Override 
public void onBeaconServiceConnect() { 
    if(!ConfigFile.isDemo()) { 
     beaconManager.setRangeNotifier(new RangeNotifier() { 
      @Override 
      public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
       if (beacons.size() > 0) { 
        UniPromClient.setIsInAnyBeaconRegion(true); 
        for (Beacon beacon : beacons) { 
         logToDisplay("Detected " + beacon.toString() + " with UUID " + beacon.getId1().toString() + " and Major ID " + beacon.getId2().toString() + " and Minor ID " + beacon.getId3().toString()); 
         UniPromClient.setUniPromBeacon(new UniPromBeacon(beacon.getId1().toString(), 
           beacon.getId2().toString(), 
           beacon.getId3().toString())); 
         Handler handler = new Handler(Looper.getMainLooper()); 
         handler.post(new Runnable() { 

          @Override 
          public void run() { 
           updateUserScoreAsUserStaying(); 
          } 
         }); 

         break; 
        } 
       } else { 
        UniPromClient.setIsInAnyBeaconRegion(false); 
        UniPromClient.setUniPromBeacon(null); 
        logToDisplay("No iBeacons detected"); 
       } 

       if (UniPromClient.isPrevIsAnyBeaconInRegion() != UniPromClient.isInAnyBeaconRegion()) { 
        if (UniPromClient.isInAnyBeaconRegion()) { 
         showMainActivityAlert("Uni Promotion alanına girdiniz :)"); 
        } else if (!UniPromClient.isInAnyBeaconRegion() && UniPromClient.isPrevIsAnyBeaconInRegion()) { 
         showMainActivityAlert("Uni Promotion alanından çıktınız :("); 
        } 
        UniPromClient.setPrevIsAnyBeaconInRegion(UniPromClient.isInAnyBeaconRegion()); 
        generateDrawerList(); 
       } 
      } 

     }); 

     try { 
      beaconManager.startRangingBeaconsInRegion(region); 
     } catch (RemoteException e) { 
     } 
    } 
} 

-------------------------- Мой класс Backgorund для обнаружения маяков на фоне ------------

@Override 
public void onCreate() { 
    super.onCreate(); 
    BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); 
    //BeaconManager.setsManifestCheckingDisabled(true); 
    //beaconManager = BeaconManager.getInstanceForApplication(this); 
    beaconManager.getBeaconParsers().clear(); 
    beaconManager.getBeaconParsers().add(new BeaconParser(). 
      setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25")); 
    beaconManager.setBackgroundScanPeriod(1000l); 
    beaconManager.setBackgroundBetweenScanPeriod(5000l); 
    Region region = new Region("com.example.myapp.boostrapRegion", null, null, null); 
    regionBootstrap = new RegionBootstrap(this, region); 
    //backgroundPowerSaver = new BackgroundPowerSaver(this); 
} 
+0

Привязка к сервису в Android должна возвращаться почти мгновенно, поэтому что-то не так. Какие типы классов являются двумя показанными выше? Мероприятия? Заявка? Когда они вызываются последовательно друг к другу? – davidgyoung

ответ

1

Если сканирование уже запущен при изменении периодов сканирования, вы должны вызвать beaconManager.updateScanPeriods(), чтобы изменения вступили в силу.

Кроме того, обратите внимание, что tgat автоматически переключает периоды сканирования переднего и заднего фона, вы должны использовать BackgroundPowerSaver, который отображается как закомментированный. Если этот параметр включен, он будет следить за тем, чтобы действия были приостановлены и возобновлены, и установите скорости сканирования в фоновые настройки, когда не видны действия.

Если вы не хотите использовать BackgroundPowerSaver, вы должны позвонить beaconManager.setBackgroundMode(true);, чтобы активировать скорость сканирования фона.

 Смежные вопросы

  • Нет связанных вопросов^_^