Прежде всего, извините мой английский, если вы найдете какие-то ошибки, и спасибо за вашу помощь. У меня есть программа, использующая службу API REST для получения списка регионов для мониторинга каждые X секунд. Я использую Android Beacon Library для мониторинга регионов, и я хочу иметь возможность прекратить мониторинг этих регионов, получить новый список, а затем начать мониторинг новых регионов. У меня есть этот код (упрощенный) до сих пор:
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 во второй раз, и приложение зарегистрировало, что оно начало отслеживать 3 региона, затем прекратило отслеживать эти 3, а затем начало отслеживать 2 новых. Вроде бы все в порядке, но, несмотря на то, что оно говорит, что оно начало отслеживать новые регионы, приложение больше никогда не показывает отслеживаемые регионы на экране, когда маяки находятся в пределах досягаемости.
Я хочу знать, связана ли проблема с тем, как я установил процесс получения регионов и их мониторинга.
Похоже, что после перезапуска мониторинга с новыми регионами не срабатывает didEnterRegion и didExitRegion.
РЕДАКТИРОВАТЬ: я тестирую пример с 3 маяками и 3 регионами. Первый маяк использует iBeacon, второй использует Eddystone-UID, а третий использует Eddystone-URL. Каждый регион настроен на обнаружение одного конкретного маяка.
Logcat (упрощенно, идентификаторы маяков и регионов указаны правильно):
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, "Using Android Beacon Library version: "+org.altbeacon.beacon.BuildConfig.VERSION_NAME);
Можете ли вы добавить в метод, перезапускающий регионы мониторинга, операторы журнала, показывающие регионы для вызовов stopMonitoringBeaconsInRegion и startMonitoringBeaconsInRegion, а затем прикрепить выходные данные оператора журнала к своему вопросу? Также было бы полезно знать идентификаторы маяков, которые вы передаете, которые не обеспечивают события входа в регион. - person davidgyoung   schedule 06.04.2016