当我试图用Android灯塔库检测区域时,我有一种奇怪的行为。
我定义了两个区域来监视带有特定ids的信标。
每次在没有区域并输入一个区域时,didEnterRegion回调将被触发两次,一次用于预期区域,另一次用于“null”区域。如果我进入第二个区域,它只会触发一次对预期区域。
这种行为正常吗?如何使它不触发这个“空”区域?
下面是我打印的日志,以便更好地显示正在发生的事情:
10-10 18:07:15.683: didEnterRegion呼叫,id1: 11111111-1111-1111-1111-111111111111 10-10 18:07:15.693:获得didEnterRegion调用,id1: null id2: null id3: null 10-10 18:07:22.946:接到didEnterRegion电话,id1: 00000000-0000-0000-000000000000 10-10 18:07:41.880: didExitRegion 11111111-1111-1111-1111-111111111111 10-10 18:07:57.913:获得didExitRegion 00000000-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());
}
}发布于 2016-10-10 21:55:05
我怀疑这个"null“区域是由旧版本的代码持久化的,当一个旧的代码版本开始对该区域进行监视时,就会发生。
要知道,每当您开始监视某个区域时,Android信标库就会将这些区域持久化到您的Android设备上的非易失性存储,因此当它重新启动时,它会记住最后一个区域状态,并且知道是否触发一个新的区域入口事件。
这样做的结果是,如果你想清除那些旧的区域,你必须这样做的规划。您可以使用以下代码修复此问题:
// Stop monitoring all currently monitored regions
for (Region region: mBeaconManager.getMonitoredRegions()) {
mBeaconManager.stopMonitoringBeaconsInRegion(region);
} 'https://stackoverflow.com/questions/39967075
复制相似问题