2017-07-31 21 views
0

私のプロジェクトでAndroidビーコンライブラリ(AltBeacon SDK)を使用しています。私の要件は、いくつかのチェックイン通知を表示することですユーザーがビーコン範囲とチェックアウト通知を入力する場合ビーコンの範囲を終了するが、私は直面している問題は、通知を取得し続けている(つまり、複数の時間を呼び出したdidRangeBeaconsInRegion(コレクションビーコン、地域地域) 。この関数は、アプリケーションがビーコンの範囲に来たときに一度だけ呼び出す必要がありますか?なぜ、RangeBeaconsInRegionが複数回呼び出されましたか?

public class BeaconMonitoringService extends Service implements BootstrapNotifier, BeaconConsumer, RangeNotifier { 



private static final String TAG = "BeaconMonitoringService"; 



private BeaconManager beaconManager; 



@SuppressWarnings("unused") 

private RegionBootstrap regionBootstrap; 

@SuppressWarnings("unused") 

private BackgroundPowerSaver backgroundPowerSaver; 

private Region region; 



@Override 

public void onCreate() { 

    super.onCreate(); 

    beaconSession = new BeaconSession(this); 

    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")); 

    region = new Region("MyBeacon", Identifier.parse("0800200C9A66"), null, null); 

    regionBootstrap = new RegionBootstrap(this, region); 

    beaconManager.setBackgroundMode(true); 

    backgroundPowerSaver = new BackgroundPowerSaver(this); 

    beaconManager.bind(this); 

} 



@Override 

public void didEnterRegion(Region region) { 

    try { 

     Log.d(TAG, "Did Enter Region."); 

     beaconManager.startRangingBeaconsInRegion(region); 

    } catch (RemoteException e) { 

     if (BuildConfig.DEBUG) Log.d(TAG, "Can't start ranging"); 

    } 

} 



@Override 

public void didExitRegion(Region region) { 

    try { 

     Log.d(TAG, "Did Exit Region"); 

    } catch (RemoteException e) { 

     if (BuildConfig.DEBUG) Log.d(TAG, "Can't start ranging"); 

    } 

} 



@Override 

public void didDetermineStateForRegion(int state, Region region) { 

    switch (state) { 

     case MonitorNotifier.INSIDE: 

      Log.d(TAG, "INSIDE"); 

      didEnterInRegion = true; 

      break; 

     case MonitorNotifier.OUTSIDE: 

      Log.d(TAG, "OUTSIDE"); 

      didEnterInRegion = false; 

      break; 

     default: 

      didEnterInRegion = false; 

      Log.d(TAG, "state" + state); 

      break; 

    } 



} 



@Override 

public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 

    if (beacons.size() > 0) { 

      for (Beacon beacon : beacons) { 



      if (beacon.getId1().equals(Identifier.parse("0800200C9A66")) && beacon.getDistance() < 1.0) { 

         sendNotification(beacon); 

        } 

      } 

    } 

} 



@Override 

public void onBeaconServiceConnect() { 

    beaconManager.addRangeNotifier(this); 

    try { 

     beaconManager.startRangingBeaconsInRegion(region); 

    } catch (RemoteException e) { 

    } 

} 



@Override 

public IBinder onBind(Intent intent) { 

    return null; 

} 



@Override 

public void onDestroy() { 

    beaconManager.unbind(this); 

    super.onDestroy(); 

} 

}

答えて

0

didRangeBeaconsInRegionは、その期間に見れたビーコンあなたを伝えるために(おき〜1秒、デフォルトでは)各スキャンサイクルの終わりに、定期的に起動するように設計されています。

各ビーコンが検出されたあとにイベントを発生させたい場合は、既に各ビーコンを処理したかどうかを示すフラグを保持するクラス変数を作成できます。このよう

// Put this at your class level 
Set<String> mBeaconsProcessed = new HashSet<>(); 

... 

// Put this code inside your didRangeBeaconsInRegion method 

// Only process this beacon if we have not done so before 
if (!mBeaconsProcessed.contains(beacon.toString)) { 
    if (beacon.getId1().equals(Identifier.parse("0800200C9A66")) && beacon.getDistance() < 1.0) { 
     sendNotification(beacon); 
     // Mark this beacon as having already been processed. 
     mBeaconsProcessed.put(beacon.toString)); 
     } 
    } 
} 
+0

おかげ@デビッドは、私はAPIで構築された機能がいくつかあるかもしれないと思った同じロジックを実装しています。 – Gkapoor

+0

もう1つの問題は、デバイスがビーコン範囲内にある間にdidExitRegionも呼び出されることです。 – Gkapoor

+0

終了ビーコン範囲の通知を表示するにはどうすればよいですか? – Gkapoor

関連する問題