У меня странное поведение при попытке обнаружить регионы с Android Beacon Library.Android Beacon Library, несущая несуществующий нулевой регион
Я определил 2 области для наблюдения за маяками с определенными идентификаторами.
Каждый раз, когда я не вхожу в какой-либо регион и вхожу в один, обратный вызов didEnterRegion запускается дважды, один раз для ожидаемой области и в другое время для области «нуль». Если я вхожу во второй регион, он запускается только один раз для ожидаемой области.
Это обычное поведение? Как я могу заставить его не запускать для этого «нулевого» региона?
Вот журнал, который я напечатал, чтобы лучше показать, что происходит:
10-10 18: 07: 15,683: Получил didEnterRegion вызов, id1: 11111111-1111-1111-1111-111111111111
10-10 18: 07: 15,693: Получил didEnterRegion вызова, ID1: нуль ID2: нуль id3: нуль
10-10 18: 07: 22,946: Получил didEnterRegion вызова, ID1: 00000000-0000-0000 -0000-000000000000
10-10 18: 07: 41.8 80: получил didExitRegion 11111111-1111-1111-1111-111111111111
10-10 18: 07: 57.913: получил didExitRegion 00000000-0000-0000-0000-000000000000
10-10 18:07: 57,914: есть didExitRegion нулевого
А вот часть моего кода:
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());
}
}
Спасибо за ответ. Действительно, у меня был «нулевой» Region в более старых версиях, поэтому он имеет смысл. Но я попытался добавить свой код внутри onCreate, и, видимо, mBeaconManager.getMonitoredRegions() не возвратил ни одного региона. Я также пробовал mBeaconManager.removeAllMonitorNotifiers(), без успеха. – luislhl
Возможно, вы не можете поместить код внутри onCreate, потому что регионы еще не восстановлены ... для быстрого исправления попробуйте поместить его в обратный вызов didEnterRegion. – davidgyoung
Но если я положил его внутрь didEnterRegion, разве он также не очистит регионы, которые я объявил в onCreate? Я тестировал, и это то, что, похоже, происходит. – luislhl