#android #altbeacon #beacon
#Android #altbeacon #маяк
Вопрос:
У меня странное поведение при попытке обнаружить регионы с помощью библиотеки Android Beacon.
Я определил 2 региона для мониторинга маяков с определенными идентификаторами.
Каждый раз, когда я не нахожусь ни в одном регионе и ввожу его, обратный вызов didEnterRegion запускается дважды: один раз для ожидаемого региона, а другой раз для «нулевого» региона. Если я ввожу второй регион, он запускается только один раз для ожидаемого региона.
Является ли такое поведение нормальным? Как я могу сделать так, чтобы она не запускалась для этой «нулевой» области?
Вот журнал, который я распечатал, чтобы лучше показать, что происходит:
10-10 18:07:15.683: Поступил вызов didEnterRegion, id1: 11111111-1111-1111-1111-11111111111111
10-10 18:07:15.693: Получен вызов didEnterRegion, id1: null id2: null id3: null
10-10 18:07:22.946: Поступил вызов didEnterRegion, id1: 00000000-0000-0000-0000-000000000000
10-10 18:07:41.880: есть didExitRegion 11111111-1111-1111-1111-11111111111111
10-10 18:07:57.913: получил didExitRegion 00000000-0000-0000-0000-0000-000000000000
10-10 18:07:57.914: получил значение didExitRegion null
И вот часть моего кода:
public class BeaconReferenceApplication extends Application implements BootstrapNotifier {
private RegionBootstrap regionBootstrap;
public void onCreate() {
super.onCreate();
// UPDATE: Trying to clear old regions.
BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
for (Region region: beaconManager.getMonitoredRegions()) {
Log.i(TAG, "Clearing old monitored region" region);
try {
beaconManager.stopMonitoringBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
ArrayList<Identifier> ids1 = new ArrayList<>(1);
ids1.add(Identifier.parse("11111111-1111-1111-1111-111111111111"));
Region region1 = new Region("region1", ids1);
ArrayList<Identifier> ids0 = new ArrayList<>(1);
ids0.add(Identifier.parse("00000000-0000-0000-0000-000000000000"));
Region region0 = new Region("region0", ids0);
ArrayList<Region> regions = new ArrayList<>(2);
regions.add(region0);
regions.add(region1);
regionBootstrap = new RegionBootstrap(this, regions);
}
@Override
public void didEnterRegion(Region region) {
Log.i(TAG, "Got a didEnterRegion call, " region);
}
@Override
public void didExitRegion(Region region) {
Log.i(TAG, "got a didExitRegion" region.getId1());
}
}
Ответ №1:
Я подозреваю, что происходит то, что «нулевая» область была сохранена более старой версией вашего кода.Это произошло бы, если бы более старая версия кода начала мониторинг для этой области.
Поймите, что всякий раз, когда вы начинаете мониторинг региона, библиотека маяков Android сохранит эти регионы в энергонезависимом хранилище на вашем устройстве Android, поэтому при перезапуске она запоминает последнее состояние региона и знает, следует ли запускать событие ввода нового региона.
Следствием этого является то, что если вы когда-нибудь захотите очистить эти старые области, вам придется делать это программно. Вы можете исправить это с помощью следующего кода:
// Stop monitoring all currently monitored regions
for (Region region: mBeaconManager.getMonitoredRegions()) {
mBeaconManager.stopMonitoringBeaconsInRegion(region);
} '
Комментарии:
1. Спасибо за ответ. Действительно, в старых версиях у меня была область ‘null’, так что это имеет смысл. Но я попытался добавить ваш код в onCreate, и, по-видимому, mBeaconManager.getMonitoredRegions() не вернул ни одного региона. Я также пробовал mBeaconManager.removeAllMonitorNotifiers(), но безуспешно.
2. Вероятно, вы не можете поместить код внутри onCreate, потому что регионы еще не восстановлены… для быстрого исправления попробуйте поместить его в обратный вызов didEnterRegion.
3. Но если я помещу ее в didEnterRegion, не очистит ли она также регионы, которые я объявил в onCreate? Я протестировал, и это то, что, похоже, происходит.
4. Я мог бы решить эту проблему, удалив приложение, поскольку я пока только тестирую его, и у меня ничего не опубликовано. Итак, ваше объяснение того, как сохраняются регионы, уже решило мою проблему, и я отмечу его как принятое. Но я хотел бы знать, есть ли способ решить это программно. Может быть, я просто перестану использовать «нулевые» области в тестах, чтобы это больше не повторилось.