我正在尝试使用我的设备检测信标设备,因此监视它们并收听范围通知。
我正在使用这个库和库参考应用程序。我设法使用设置信标布局方法收听自定义信标。
步骤1。我在应用程序类第 2 步中设置了布局。我将 baseactivity 实现了 beaconconsume,它在其中执行测距。
启动范围监控服务/方法时,我们使用“myRangeUniqueId”,但我认为 didexit 和 didenter 方法使用“backgroundId”。为什么呢?
所以情况是这样的,我将信标设备移动了几米远,我仍然看到一个信标通知,但我没有看到一个信标。即使信标很远,这些消息也会交替变化。
我必须做些什么来防止这种情况发生吗?请帮忙。
代码片段包括以下:
应用类实现BootstrapNotifier,代码如下
BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this); beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("LAYOUT_HERE")); Region region = new Region("backgroundRegion", null, null, null); regionBootstrap = new RegionBootstrap(this, region); // simply constructing this class and holding a reference to it in your custom Application // class will automatically cause the BeaconLibrary to save battery whenever the application // is not visible. This reduces bluetooth power usage by about 60% backgroundPowerSaver = new BackgroundPowerSaver(this); @Override public void didEnterRegion(Region arg0) { // In this example, this class sends a notification to the user whenever a Beacon // matching a Region (defined above) are first seen. Log.d(TAG, "did enter region."); if (!haveDetectedBeaconsSinceBoot) { Log.d(TAG, "auto launching MainActivity"); haveDetectedBeaconsSinceBoot = true; } else { // i am not sending out any notification here since there could be multiple beacons and i need to identify any one of them with a specific uuid } } @Override public void didExitRegion(Region region) { sendNotification("exited",2); }
我在didDetermineStateForRegion
方法上什么都不做,它只是被覆盖了
我有一个
BaseActivity
实现BeaconConsumer
private BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); beaconManager.bind(this); } @Override protected void onDestroy() { super.onDestroy(); beaconManager.unbind(this); } @Override protected void onPause() { super.onPause(); if(beaconManager.isBound(this))beaconManager.setBackgroundMode(true); } @Override protected void onResume() { super.onResume(); if (beaconManager.isBound(this)) beaconManager.setBackgroundMode(false); } @Override public void onBeaconServiceConnect() { beaconManager.setRangeNotifier(new RangeNotifier() { @Override public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { if (beacons.size() > 0) { /*EditText editText = (EditText)RangingActivity.this .findViewById(R.id.rangingText); Beacon firstBeacon = beacons.iterator().next(); logToDisplay("The first beacon "+firstBeacon.toString()+" is about "+firstBeacon.getDistance()+" meters away."); */ CommonUtilities.sendNotification(BaseActivity.this,"entered",1); } } } } } }); try { beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId",null, null, null)); } catch (RemoteException e) { } }
PS:当我将设备移动到大约 5 米外的另一个位置时,我会收到随机通知,表明信标在范围内,然后我立即收到信标超出范围的通知。
谢谢