信标和区域的正确使用方法

Correct way to use beacon and region

使用 iBeacon。 据我了解,我应该使用 "beaconManager.startRangingBeaconsInRegion" 或 "startMonitoringBeaconsInRegion" 开始扫描信标。 但是我尝试创建一个区域,当进入和退出该区域时,它们会显示 "null"、"null"、"null"

等标识符

我需要知道何时不再检测到特定信标

按照下面的代码,考虑到"LocusData.locusBeacons"中是ArrayList,其中包含先前注册的信标

@Override
public void onBeaconServiceConnect() {
    beaconManager.addRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
            if (beacons.size() > 0) {
                Beacon aux = beacons.iterator().next();
                Log.i("ScanBeacon", "The beacon "+
                        aux.getId1().toString()+"|"+
                        aux.getId2().toString()+"|"+
                        aux.getId3().toString());

                LocusData.updateDistance(
                        aux.getId1().toString(),
                        aux.getId2().toString(),
                        aux.getId3().toString(),
                        aux.getDistance());
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    notifyListView();
                }
            });

        }
    });

    beaconManager.addMonitorNotifier(new MonitorNotifier() {

        @Override
        public void didEnterRegion(Region region) {
            Log.i("SCANNING", "ENTER: " +
                    region.getId1() + "|" +
                    region.getId2() + "|" +
                    region.getId3());
        }

        @Override
        public void didExitRegion(Region region) {
            Log.i("SCANNING", "EXIT: " +
                    region.getId1() + "|" +
                    region.getId2() + "|" +
                    region.getId3());
        }

        @Override
        public void didDetermineStateForRegion(int state, Region region) {
            //Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state);
        }
    });

    try {
        for (LocusBeacon i : LocusData.locusBeacons) {
            beaconManager.startRangingBeaconsInRegion(new Region(i.getId(),
                    Identifier.parse(i.getUUID()),
                    Identifier.fromInt(Integer.parseInt(i.getMajor())),
                    Identifier.fromInt(Integer.parseInt(i.getMinor()))));
        }
    } catch (RemoteException e) {    }

}

如果您监控一个定义了标识符的所有三个部分的区域,然后开始监控,当通过执行此操作停止检测到确切的信标时,您将收到回调:

for (LocusBeacon i : LocusData.locusBeacons) {
        beaconManager.startMonitoringBeaconsInRegion(new Region(i.getId(),
                Identifier.parse(i.getUUID()),
                Identifier.fromInt(Integer.parseInt(i.getMajor())),
                Identifier.fromInt(Integer.parseInt(i.getMinor()))));
}

didExitRegion(Region region) 的回调将有一个区域对象,该对象具有用于开始监视消失的特定信标的相同标识符。

要实现这一点,i.getId() 返回的字符串必须是唯一的。

如果您还在监视所有标识符都设置为空的区域,则当所有信标从视图中消失时,didExitRegion 将为该区域触发。