Я пытаюсь обнаружить устройства маяка, используя свое устройство, и поэтому отслеживаю их, а также прослушиваю уведомления о диапазоне.
Я использую эту библиотеку и приложение-справочник по библиотеке. Мне удалось прослушать пользовательский маяк, используя метод настройки макета маяка.
Шаг 1. Я устанавливаю макет в классе приложения. Шаг 2. Я делаю базовую активность реализующей 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) { } }
P.S: Когда я перемещаю устройство в другое место, скажем, на расстояние около 5 метров, я получаю случайное уведомление о том, что маяк находится в пределах досягаемости, а затем сразу же получаю уведомление о том, что маяк находится вне досягаемости.
Спасибо