2016-05-21 8 views
0

アプリケーションを起動すると、スキャンが開始され、onBeaconServiceConnect()関数が2〜3秒で起動します。私はそれを増やす必要がある。また、別のクラスをスキャンする背景ビーコンを使用します。私は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) { 
     } 
    } 
} 

-------------------------- My 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のサービスへのバインディングは、ほとんど瞬時に戻るはずです。何かが間違っています。上記の2つのクラスはどのような種類のクラスですか?アクティビティ?応用?彼らはいつ順番に呼び出されますか? – davidgyoung

答えて

1

は、変更を有効にするためにbeaconManager.updateScanPeriods()を呼び出す必要があります。

また、フォアグラウンド/バックグラウンドスキャン期間を自動的に切り替えるには、コメントアウトされているBackgroundPowerSaverを使用する必要があります。有効にすると、アクティビティが一時停止および再開されるのを監視し、アクティビティが表示されていない場合はスキャンレートをバックグラウンド設定に設定します。

BackgroundPowerSaverを使用しない場合は、beaconManager.setBackgroundMode(true);に電話をかけてバックグラウンドスキャンレートを有効にする必要があります。

関連する問題