当您在信标区域之外时,有时会输入didEnterRegion。
有时在信标区域中未输入didEnterRegion。这持续很长时间。
终端是Fujitsu箭头M03。 Android™6.0
当您在didEnterRegion中时,可以使用didRangeBeaconsInRegion获取信标信息。
该活动由前台服务使用。
BeaconManager用作该服务的前台。
屏幕关闭。但是,在服务中获取了akeLock。
信标扫描间隔为4秒。 setForegroundBetweenScanPeriod(4000);
以10秒为间隔关闭/打开监视。
切勿输入didExitRegion。我认为有必要打开监视10秒钟以上才能进入。
是否需要牢固地生成didExitRegion?
最好不要每10秒打开/关闭监视吗?开总是更好吗?
信标检测设置
g_beaconManager = BeaconManager.getInstanceForApplication(this);
g_beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
g_beaconManager.bind(this);
g_beaconManager.setForegroundBetweenScanPeriod(4000);
g_region = new Region("iBeacon", null, null, null);
BeaconManager服务
@Override
public void onBeaconServiceConnect() {
g_beaconManager.addMonitorNotifier(new MonitorNotifier() {
public void didEnterRegion(Region region) {
Log.d("Beacon", "didEnterRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didExitRegion(Region region) {
Log.d("Beacon", "didExitRegion Success!!");
if (g_beaconManager.getRangedRegions().size() != 0) {
try {
g_beaconManager.stopRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
Log.d("Beacon", "didDetermineStateForRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
try {
g_beaconManager.startMonitoringBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
g_beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region) {
Beacon lBeacon_Most_Near_Distance = null;
Log.d("Beacon" , "addRangeNotifier Success!!");
for (Beacon beacon : Beacons) {
if (lBeacon_Most_Near_Distance == null)
{
lBeacon_Most_Near_Distance = beacon;
}
else
{
if (lBeacon_Most_Near_Distance.getDistance() > beacon.getDistance())
{
lBeacon_Most_Near_Distance = beacon;
}
}
}
}
});
}
每隔10秒钟监控一次关闭/开启
try {
if (g_beaconManager.getRangedRegions().size() != 0) {
g_beaconManager.stopRangingBeaconsInRegion(g_region);
}
if (g_beaconManager.getMonitoredRegions().size() != 0) {
g_beaconManager.stopMonitoringBeaconsInRegion(g_region);
} else {
g_beaconManager.startMonitoringBeaconsInRegion(g_region);
}
} catch (RemoteException e) {
e.printStackTrace();
}
该库通过在10秒钟内未看到任何可见的信标包来确定它已退出区域。可以通过调用BeaconManager.setRegionExitPeriod(15000); // change to 15 seconds
将此常量重写为所需的任何值。如果长时间不让监视运行,则不会收到任何区域退出事件。
该库旨在让您打开监视并长时间保持打开状态。在这么短的时间后将其关闭不仅会引发问题,不仅会导致区域退出,还会导致频繁启动和停止扫描,这是一项繁琐的操作,可能导致Android OS阻止以后的扫描。