我正在尝试使用我的设备检测信标设备,因此监控它们并听取范围通知。
我正在使用this库和库参考应用。我设法使用set beacon布局方法收听自定义信标。
步骤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) { }
}
P.S:当我将设备移动到距离大约5米远的不同位置时,我会收到随机通知,信标在范围内,然后我立即收到信标超出范围的通知。
由于
答案 0 :(得分:1)
几点:
唯一标识符用作标识Region
的键,以便您可以启动和停止测距和监控。您构建并在系统中注册的每个区域都应该有一个不同的字符串标识符,但只要它是唯一的,该值就可以是您所不同的值。
每秒都会进行didRangeBeaconsInRegion
回调,而不仅仅是当移动设备进入信标范围时。
如果您在信标处于20米左右的范围内时重复进行didExitRegion
次回调,则可能会有一个频率不够频繁的信标。了解信标的品牌,型号和传输频率以及您的移动设备型号可能有助于解决这个问题。