didEnterRegion事件在离开信标区域时触发



当您在信标区域之外时, 您有时会输入didEnterRegion.

有时在信标区域时不进入区域. 这持续了很长时间。

终端是富士通箭头M03。安卓 ™ 6.0

当您在didEnterRegion时,您可以使用didRangeBeaconsInRegion获取信标信息。

该活动由前台服务使用。

信标管理器用作该服务的前台。

屏幕已关闭。但是,唤醒锁是在服务中获取的。

信标扫描间隔为 4 秒. 设置前景扫描周期之间 (4000(;

监控以 10 秒的间隔关闭/打开。

永远不要进入退出区域。 我认为有必要打开监控超过10秒才能进入。

是否有必要牢固地生成 didExitRegion?

最好不要每 10 秒打开/关闭一次监控吗?ON总是更好吗?

信标检测设置

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);

信标管理器服务

@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 操作系统阻止未来的扫描。

谢谢你的回答。

我要你再告诉我一个

startMonitoringBeaconsInRegion or startRrangeingBeaconsInRegion 最好先删除所有监视器通告器或删除所有范围通告器?

也停止后。

在示例代码中,仅在连接服务时执行此操作。 https://altbeacon.github.io/android-beacon-library/samples.html

应用此功能的程序如下。

@Override
public void onBeaconServiceConnect() {
g_beaconManager.removeAllMonitorNotifiers();
g_beaconManager.removeAllRangeNotifiers();
g_beaconManager.addMonitorNotifier(new MonitorNotifier() {
public void didEnterRegion(Region region) {
Log.d("Beacon", "didEnterRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.removeAllRangeNotifiers();
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);
g_beaconManager.removeAllRangeNotifiers();
} 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.removeAllRangeNotifiers();
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;
}
}
}
}
});
}

最新更新