我希望我的应用程序始终跟踪信标
它开始跟踪似乎工作很好
之后,didRangeBeaconsInRegion()
有一个空的信标集合
这是我的代码
public void onCreate() {
super.onCreate();
Log.d(TAG, "create");
beaconManager = BeaconManager.getInstanceForApplication(this);
try {
beaconManager.getBeaconParsers().clear();
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
beaconManager.setBackgroundScanPeriod(1101l);
beaconManager.setBackgroundBetweenScanPeriod(1101l);
beaconManager.setForegroundBetweenScanPeriod(1101l);
beaconManager.updateScanPeriods();
} catch (RemoteException e) { }
backgroundPowerSaver = new BackgroundPowerSaver(this);
startBeaconRanging();
}
public void startBeaconRanging() {
courseId = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString(getString(R.string.course_id), "");
Log.d(TAG, "startBeaconRanging on courseId = " + courseId);
if (!courseId.equals("")) {
syncBeaconWithFirebase(courseId);
endTime = CourseSQLiteManager.getColumnById(getApplicationContext(), courseId, COURSE_ENDTIME);
regionBootstrap = new RegionBootstrap(this, new Region("ranged region", null, null, null));
}
}
public void stopBeaconRanging() {
if (regionBootstrap != null) {
regionBootstrap.disable();
try {
Log.d(TAG, "end");
courseId = "";
beaconManager.stopRangingBeaconsInRegion(getRegion());
beaconManager.removeAllRangeNotifiers();
} catch (RemoteException e) { }
}
}
@Override
public void didEnterRegion(Region region) {
Log.d(TAG, "enter");
try {
Region r = getRegion();
if(r == null) {
regionBootstrap = new RegionBootstrap(this, new Region("ranged region", null, null, null));
Log.d(TAG, "null");
}
if(r != null) {
beaconManager.startRangingBeaconsInRegion(r);
beaconManager.addRangeNotifier(this);
}
} catch (RemoteException e) { }
}
@Override
public void didExitRegion(Region region) {
try {
if(getRegion() != null) beaconManager.stopRangingBeaconsInRegion(getRegion());
} catch (RemoteException e) { }
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
}
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if(beacons.size() > 0) {
Beacon beacon = beacons.iterator().next();
Log.d(TAG, beacon.getId2().toInt() + " " + beacon.getDistance() + " " + beacon.getRssi());
if(isAfterEndTime()) {
stopBeaconRanging();
}
}
}
编辑:这就像前景和背景一样。但如果我杀了我的应用并再次打开它,我可以找到灯塔,但也只是片刻。
EDIT2:isAfterEndTime
返回false,但找不到任何信标。但didExitRegion
触发与didEnterRegion
交换,并找到零信标
PS。我想一次只跟踪一个信标
PS.2抱歉我的英语不好。我不确定,你能得到我想要清楚的问题吗?
答案 0 :(得分:0)
要检查的一些事项:
确保未触发此代码。我看不到方法的定义,但如果它返回true,则会导致范围停止:
if(isAfterEndTime()) {
stopBeaconRanging();
}
在didExitRegion
中添加调试行,以确保没有调用它。 (因为它也会停止测距。)顺便说一句,我认为你不需要这样做的代码 - 如果你还没有检测到信标,那么只需继续测距就没有效率成本。
确保此行代码只执行一次,因为RegionBootstrap不是设计为重复创建的:
regionBootstrap = new RegionBootstrap(this, new Region("ranged region", null, null, null));
不要重复创建一个新的RegionBootstrap对象,只需在程序开头创建一个。如果您想要更改受监控的区域,可以使用beaconManager.stopMonitoringBeaconsInRegion(region1);
和beaconManager.startMonitoringBeaconsInRegion(region2);