使用AltBeacon安卓库首次启动在信标区域时didEnterRegion不触发求助
问题原因
AltBeacon 库的didEnterRegion回调设计为仅在区域状态从「不在区域内」切换为「在区域内」时触发。应用首次启动时如果用户已经处于信标覆盖范围,不存在状态切换过程,因此不会触发该回调。
解决方案
你已经实现的didDetermineStateForRegion回调刚好可以解决这个问题:每次启动区域监测时,该回调都会主动返回当前的区域状态,不需要等待状态切换。
你可以把进入区域的逻辑抽为公共方法,在didEnterRegion、以及didDetermineStateForRegion判断到当前在区域内时都调用即可,修改后的参考代码如下:
// 抽离公共的进入区域处理逻辑 private void handleRegionEnter() { sendData(dataStart); mHandler.post(new Runnable() { @Override public void run() { tv_beacon_.setText("work"); } }); } // 抽离公共的离开区域处理逻辑 private void handleRegionExit() { sendData(dataEnd); mHandler.post(new Runnable() { @Override public void run() { tv_beacon_.setText("not work"); } }); } beaconManager.addMonitorNotifier(new MonitorNotifier() { @Override public void didEnterRegion(Region region) { handleRegionEnter(); } @Override public void didExitRegion(Region region) { handleRegionExit(); } @Override public void didDetermineStateForRegion(int state, Region region) { Log.i(TAG, "当前区域状态: "+state); // state为1代表当前在区域内,0代表不在 if (state == MonitorNotifier.INSIDE) { handleRegionEnter(); } else if (state == MonitorNotifier.OUTSIDE) { handleRegionExit(); } } });
如果不想重复触发,可以加个布尔标记位判断当前是否已经处理过进入/离开状态,避免重复调用业务逻辑。
内容的提问来源于stack exchange,提问作者hyeonbin
相关产品推荐
相关产品推荐

