[didEnterRegion事件超出信标区域时触发

问题描述 投票:0回答:1

当您在信标区域之外时,有时会输入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();
}
ibeacon-android
1个回答
0
投票

该库通过在10秒钟内未看到任何可见的信标包来确定它已退出区域。可以通过调用BeaconManager.setRegionExitPeriod(15000); // change to 15 seconds将此常量重写为所需的任何值。如果长时间不让监视运行,则不会收到任何区域退出事件。

该库旨在让您打开监视并长时间保持打开状态。在这么短的时间后将其关闭不仅会引发问题,不仅会导致区域退出,还会导致频繁启动和停止扫描,这是一项繁琐的操作,可能导致Android OS阻止以后的扫描。

© www.soinside.com 2019 - 2024. All rights reserved.