まず、間違いを見つけていただき、ありがとうございました。私はすべての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はもう解雇されていません。
使用しているライブラリのバージョンを確認できますか? 'Log.d(TAG、" Android Beacon Libraryバージョンの使用: "+ org.altbeacon.beacon.BuildConfig.VERSION_NAME);'監視領域を再起動するメソッドでは、stopMonitoringBeaconsInRegionの領域を示すログ文を追加できます。 startMonitoringBeaconsInRegionの呼び出しを行い、ログ・ステートメントの出力を質問に添付しますか?地域入力イベントを提供していない送信しているビーコンの識別子を知ることも役立ちます。 – davidgyoung
ログ情報を追加してコードを明確にしました。 – Elo
ところで、他のアプリを使って、Locate、Beacon Manager、Estimoteのようなビーコンを検出しています(ただし、上記のテストと同時にではありません)。同時にいくつかを実行すると、私がそれらのうちの1つだけをスキャンするまでビーコンを検出しないでください。それは正常な行動ですか? – Elo