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

didEnterRegion event fired when out of beacon area

当你在信标区域外时,有时会进入didEnterRegion。

有时在信标区不进入didEnterRegion。 这会持续很长时间。

终端是富士通箭矢M03。 Android™ 6.0

在didEnterRegion中可以通过didRangeBeaconsInRegion获取beacon信息

activity 被前台服务使用。

BeaconManager 在该服务中用作前台。

屏幕关闭。但是在服务中获取了wakeLock。

信标扫描间隔为4秒。 setForegroundBetweenScanPeriod (4000);

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

永远不要输入 didExitRegion。 我觉得需要开启监控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);

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秒监控一次OFF/ON

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 阻止未来的扫描.

感谢您的回答。

我想让你再告诉我一个

startMonitoringBeaconsInRegion 或 startRangingBeaconsInRegion 最好在执行之前执行 removeAllMonitorNotifiers 或 removeAllRangeNotifiers?

也是停止后。

示例代码中,仅在连接服务时进行。 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;
                    }
                }
            }
        }
    });
}