[###预期行为
只有当信标实际离开该区域时,lib才应该消防出口。
实际行为
lib在信标仍在范围内的情况下触发exit和enter region方法。这种情况每隔20秒发生一次,有时频率更高,而在5-7的所有android版本中频率较低
重现此行为的步骤
我在后台连续运行信标应用程序,一旦蓝牙打开搜索信标,信标固定在车内,并以1000s的间隔广播。当用户进入范围时,我必须开始骑行,当用户离开它时,我必须停止骑行,但问题是itt报告信标连续进入和退出,而用户从未离开信标区域。
我的代码片段
public class BackgroundBeaconScan extends Service implements BootstrapNotifier, BeaconConsumer {
@Override
public void onCreate() {
super.onCreate();
AppUtils.isBGServiceActive = true;
//AppUtils.appTerminated = false;
Log.e("Beacon", "Service Start");
Log.e("Bfpk", " *** Beacon Service is started *** ");
LoggingOperations logger = new LoggingOperations();
Thread.setDefaultUncaughtExceptionHandler(logger);
mBeaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
try {
Log.e("BG", "iam in mBeaconManager to unbind it");
mBeaconManager.unbind(this);
mBeaconManager.removeAllRangeNotifiers();
mBeaconManager.removeAllMonitorNotifiers();
mBeaconManager.removeMonitoreNotifier(this);
} catch (OutOfMemoryError e) {
Log.e("BG", "iam in mBeaconManager to unbind it excep ");
}
mBeaconManager.getBeaconParsers().clear();
//set Beacon Layout for Eddystone-UID packet
mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
// rideBDD = new RideBDD(getApplicationContext());
mBeaconManager.setForegroundScanPeriod(20001);
mBeaconManager.setForegroundBetweenScanPeriod(50001);
mBeaconManager.setBackgroundScanPeriod(20001);
mBeaconManager.setBackgroundBetweenScanPeriod(50001);
mBeaconManager.setBackgroundMode(true);
mBeaconManager.setDebug(true);
BeaconManager.setAndroidLScanningDisabled(true);
notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
namespace = DataHandler.getStringPreferences(AppConstants.UUID_NAME_SPACE);
instanceID = DataHandler.getStringPreferences(AppConstants.UUID_INSTANCE_ID);
Log.e("BG", "namespace :" + namespace);
Log.e("BG", "instanceID :" + instanceID);
Long currentTime = System.currentTimeMillis();
String time = formateLongToOnlyDateForServer(currentTime);
LoggingOperations.writeToFile(BackgroundBeaconScan.this,"UUID > " + time + " -- > " + namespace + " - " + instanceID);
try {
Log.e("BG", "iam in mBeaconManager.isBound");
mBeaconManager.bind(this);
Log.e("BG", "iam in mBeaconManager.bind");
} catch (OutOfMemoryError e) {
Log.e("BG", "iam in mBeaconManager.bindexce", e);
}
}我的服务连接
@Override
public void onBeaconServiceConnect() {
// String preiBeaconUUID = DataHandler.getStringPreferences(AppConstants.UUID);
// postiBeaconUUID=AppUtils.addDashes(preiBeaconUUID);
Region region;
try {
Log.e("BG", "iam in onBeaconServiceConnect");
namespace = DataHandler.getStringPreferences(AppConstants.UUID_NAME_SPACE);
instanceID = DataHandler.getStringPreferences(AppConstants.UUID_INSTANCE_ID);
Identifier myBeaconNamespaceId = Identifier.parse(namespace);
Identifier myBeaconInstanceId = Identifier.parse(instanceID);
region = new Region("EdstUIDAdvertising", myBeaconNamespaceId, myBeaconInstanceId, null);
mBeaconManager.addMonitorNotifier(this);
Log.e("BG", "iam in startMonitoringBeaconsInRegion");
} catch (Exception e) {
Log.e("BG", "iam in startMonitoringBeaconsInRegionExce" + e);
e.printStackTrace();
namespace = DataHandler.getStringPreferences(AppConstants.UUID_NAME_SPACE);
instanceID = DataHandler.getStringPreferences(AppConstants.UUID_INSTANCE_ID);
Identifier myBeaconNamespaceId = Identifier.parse(namespace);
/* Identifier myBeaconInstanceId = Identifier.parse(instanceID);*/
region = new Region("EdstUIDAdvertising", myBeaconNamespaceId, null, null);
mBeaconManager.addMonitorNotifier(this);
Log.e("BG", "iam in startMonitoringBeaconsInRegion");
}
AppUtils.isBGServiceActive = true;
try {
mBeaconManager.startMonitoringBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
mBeaconManager.addMonitorNotifier(new MonitorNotifier() {
@Override
public void didEnterRegion(Region region) {
Log.e("Monitored", "entered"); this fires at the same time
enterCount++;
}
@Override
public void didExitRegion(Region region) {
Log.e("Monitored", "exited"); // this fires at the same time
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
}
});
}这个
移动设备型号和操作系统版本
三星备注5 (7.0) s6 (6.0) s5 (5.0)每台设备
Android信标库版本
2.12.4 //请帮助我面对这个问题已经很久了
发布于 2018-01-14 03:21:19
这是由间歇性检测信标引起的常见问题。要知道,当很长一段时间没有检测到信标时,库才知道信标何时消失(退出区域)。当扫描周期结束时,如果在至少10秒内看不到以前看到的信标,库将触发区域退出事件。
建议:
示例代码中设置的自定义扫描周期可能会加剧您遇到的问题,该周期显示scanPeriod为5秒,后跟betweenScanPeriod为20秒。如果在5秒scanPeriod期间未能检测到附近的信标。
不清楚为什么在您配置的5秒扫描期间,有时无法检测到您的信标。这可能是因为它们只是不频繁地传输。一些信标仅每隔5秒左右发送一次广告数据包,以节省电池电量。如果是这样的话,它肯定会导致您所描述的问题。即使它们被设置为每秒传输一次,有时也可能由于无线电噪声而丢失一行中的5个数据包。
如果使用库的默认设置,则不太可能发生这种情况,因为扫描是在前台持续执行的(这使得在触发出口之前检测到信标的可能性更大),并在后台持续10秒。如果您不能或不想增加信标的广告速率,我建议您将scanPeriod / betweenScanPeriod设置调整为每30秒大于5秒。
为了库的正常运行,扫描周期必须至少是信标传输周期的5倍。这是因为并非所有的蓝牙数据包都会由于无线电噪声而被接收到。间隔是传输周期的5倍意味着在每个后台扫描周期上有5次机会接收包,这使得库不太可能错过一个包
https://stackoverflow.com/questions/48243356
复制相似问题