2016-04-06 26 views
0

まず、間違いを見つけていただき、ありがとうございました。私はすべてのX秒を監視する領域のリストを取得するAPI RESTサービスを消費するプログラムを持っています。私は地域を監視するためにAndroid Beacon Libraryを使用しています。これらの地域の監視を停止し、新しいリストを取得し、新しい地域の監視を開始したいと考えています。Androidビーコンライブラリの再起動モニタリング、ダイナミックリージョン

public class MainActivity extends Activity implements BeaconConsumer { 
    // Code 
    Timer task = new TimerTask() { 
    @Override 
    public void run() { 
     handler.post(new rRunnable() { 
     @Override 
     public void run() { 
      new MyAsyncTask().execute(some_params); 
     } 
     }); 
    } 
    } 

    @Override 
    protected void onCreate(Buncle savedInstanceState) { 
    // Code 
    beaconManager = BeaconManager.getInstanceForApplication(this); 
    // Set parsers (iBeacon, Eddystone-UID, Eddystone-URL) 
    beaconManager.bind(this); 
    Log.i(TAG, "Using Android Beacon Library version: "+ org.altbeacon.beacon.BuildConfig.VERSION_NAME); 
    } 

    @Override 
    public void onBeaconServiceConnect() { 
    @Override 
    public void didEnterRegion(Region region) { 
     // Get info of regions and show a list of regions detected on UI 
     Log.i(TAG, "Inside of: " + region.toString()); 
    } 

    @Override 
    public void didExitRegion(Region region) { 
     // Get info of regions and show a list of regions detected on UI 
     Log.i(TAG, "Outside of: " + region.toString()); 
    } 

    @Override 
    public void didDetermineStateForRegion(int state, Region region) { 
     Log.i(TAG, "State: " + state); 
    } 

    // execute async task to stop monitoring, get new regions list and then 
    // start monitoring again 
    timer.schedule(task, 0, 30000); 
    } 

    private class MyAsyncTask extends AyncTask<String, Void, List<Region>> { 
    @Override 
    protected List<Region> doInBackground(String... params) { 
     // Get list of regions from server 
    } 

    @Override 
    protected void onPostExecute(List<Region> result) { 
     // For loop to stop monitoring all regions 
     for (Region region : beaconManager.getMonitoredRegions()) { 
     try { 
      beaconManager.stopMonitoringBeaconsInRegion(region); 
      Log.i(TAG, "Stop monitoring: " + region.toString()); 
     } catch (RemoteException e) { } 
     } 
     Log.i(TAG, "Nº of regions: " + beaconManager.getMonitoredRegions().size()); 
     // For loop to start monitoring new regions 
     for (Region region : result) { 
     try { 
      beaconManager.startMonitoringBeaconsInRegion(region); 
      Log.i(TAG, "Start monitoring: " + region.toString()); 
     } catch (RemoteException e) { } 
     } 
     Log.i(TAG, "Nº of regions: " + beaconManager.getMonitoredRegions().size()); 
    } 
    } 

コードとクラッシュしていないアプリに構文間違いがありません:私は今のところ(簡体字)、このコードを持っています。アプリケーションを実行すると、サーバを呼び出し、監視する領域のリストを取得して、その領域の監視を開始します。次に、ビーコンが範囲内にあるときに、監視される領域のリストが画面に表示されます。今のところはすべてが大丈夫だと思う。次に、アプリは領域の監視を停止し、領域の新しいリストを要求し、新しい領域の監視を開始します。私は最初に3つの領域を試し、2つ目は2つ目のアプリケーションを記録し、3つの領域の監視を開始した後、3つの領域の監視を停止し、2つの領域の監視を開始しました。すべてがうまく見えますが、新しい地域の監視を開始したと言われていますが、ビーコンが範囲内にあるときに画面上で監視されている領域を再び表示することはありません。

問題が地域を取得して監視するプロセスであるかどうかを知りたいと思います。

新しい領域で監視を再開した後、didEnterRegionとdidExitRegionは起動しないようです。

EDIT:この例では、3つのビーコンと3つの領域でテストしています。最初のビーコンはiBeaconを使用し、2番目のビーコンはEddystone-UIDを使用し、3番目のビーコンはEddystone-URLを使用します。各領域は、1つの特定のビーコンを検出するように構成される。

Logcat(簡体字、ビーコンと地域のIDがすべて正しい):

Using Android Beacon Library version: 2.7 
Nº of regions: 0 
Start monitoring: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor 
Start monitoring: id1: eddystone_namespace id2: eddystone_id id3: null 
Start monitoring: id1: eddystone_url id2: null id3: null 
Nº of regions: 3 
State: 1 
Inside of: id1: eddystone_url id2: null id3: null 
State: 1 
Inside of: id1: eddystone_namespace id2: eddystone_id id3: null 
State: 1 
Inside of: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor 

30 seconds later (more or less)... 
I have not changed the regions provided by the server. 

Stop monitoring: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor 
Stop monitoring: id1: eddystone_namespace id2: eddystone_id id3: null 
Stop monitoring: id1: eddystone_url id2: null id3: null 
Nº of regions: 0 
Start monitoring: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor 
Start monitoring: id1: eddystone_namespace id2: eddystone_id id3: null 
Start monitoring: id1: eddystone_url id2: null id3: null 
Nº of regions: 3 

30 seconds later (more or less)... 

Stop monitoring: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor 
Stop monitoring: id1: eddystone_namespace id2: eddystone_id id3: null 
Stop monitoring: id1: eddystone_url id2: null id3: null 
Nº of regions: 0 
Start monitoring: id1: ibeacon_id id2: ibeacon_major id3: ibeacon_minor 
Start monitoring: id1: eddystone_namespace id2: eddystone_id id3: null 
Start monitoring: id1: eddystone_url id2: null id3: null 
Nº of regions: 3 

Keep repeating... 

私たちが見ることができるように、イベントdidEnterRegion、didExitRegionとdidDetermineStateForRegionはもう解雇されていません。

+0

使用しているライブラリのバージョンを確認できますか? 'Log.d(TAG、" Android Beacon Libraryバージョンの使用: "+ org.altbeacon.beacon.BuildConfig.VERSION_NAME);'監視領域を再起動するメソッドでは、stopMonitoringBeaconsInRegionの領域を示すログ文を追加できます。 startMonitoringBeaconsInRegionの呼び出しを行い、ログ・ステートメントの出力を質問に添付しますか?地域入力イベントを提供していない送信しているビーコンの識別子を知ることも役立ちます。 – davidgyoung

+0

ログ情報を追加してコードを明確にしました。 – Elo

+0

ところで、他のアプリを使って、Locate、Beacon Manager、Estimoteのようなビーコンを検出しています(ただし、上記のテストと同時にではありません)。同時にいくつかを実行すると、私がそれらのうちの1つだけをスキャンするまでビーコンを検出しないでください。それは正常な行動ですか? – Elo

答えて

0

Android Beacon Libraryの2.7リリースでは、すべての地域でスキャンを停止した後、Android 5以降のデバイスでスキャンが停止されました(これまでのところ)バグがありました。サービスからアンバインドして再バインドせずにスキャンを再開することはできません。この作品は、2.8リリースで行われた、と私はバグがもはや2.8に存在することを確認していない道へ

04-11 08:35:07.655 D/BeaconService: stopMonitoring called 
04-11 08:35:07.655 D/BeaconService: Currently monitoring 0 regions. 
04-11 08:35:07.655 D/CycledLeScanner: stop called 
04-11 08:35:07.655 D/CycledLeScanner: disabling scan 
... 
04-11 08:35:07.663 D/BeaconService: Currently monitoring 1 regions. 
04-11 08:35:07.663 D/CycledLeScanner: start called 
04-11 08:35:07.663 D/CycledLeScanner: scanning already started 

変更:デバッグログで

がオンになって、これはとして現れました。 2.8バージョンでは、後半は次のようになります。

04-12 18:15:07.623 D/BeaconService: Currently monitoring 1 regions. 
04-12 18:13:06.938 D/CycledLeScanner: start called 
04-12 18:13:06.938 D/CycledLeScanner: starting a new scan cycle 
04-12 18:13:06.939 D/CycledLeScanner: starting a new bluetooth le scan 

は2.8を使用すると、新しい地域の監視を開始し、すべての地域の監視を停止することができ、かつビーコンが近くにある場合は、すぐに最初のコールバックを取得します。簡単な解決方法は、JCenterまたは直接ダウンロードすることで2.8にアップグレードすることですhere.

+0

コードを変更せずにライブラリを更新しましたが、正しく動作しているようです。ログには、「I/BeaconService:監視停止」と「I/BeaconService:監視開始」が表示されます。ちょっとした問題があります:今はxDでビーコンが検出されません。ビーコンIDはすべてOKで、他のアプリもビーコンを見つけることができます。 – Elo

+0

2.8の変更点の1つは、ライブラリがアプリケーションの再起動後に監視対象領域の状態を覚えていることです。したがって、アプリケーションを停止してビーコンを送信して再起動した場合、追加の 'didEnterRegion'コールバックは取得されません。これはあなたが見ているものかもしれません。実際にビーコンをオフにして、出口を待ってから再度オンにして、入力イベントを取得してみてください。 – davidgyoung

+0

私はEstimoteスリープモードを使用していますが、地域を離れる/入力するとアプリが検出しません。 – Elo