我是Android编程和Altbeacon库的新手。我可以设置我想要的信标,但是我需要处理该区域没有信标的情况,并显示一个对话框。我可以显示一个没有问题的对话框,但是我不知道如何捕获“在区域中找不到信标...帮助?!?!?”。

这是我的代码(从altbeacon示例中进行了一些修改)...

 public void onBeaconServiceConnect() {
    beaconManager.setRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {

                if (beacons.size() > 0) {

                    Beacon firstBeacon = beacons.iterator().next();
                        Log.i(TAG, "The first beacon I see is about " + beacons.iterator().next().getDistance() + " meters away."}
            }
        });


   try {
        Log.d(TAG, "setting up background monitoring for beacons and power saving");
        // wake up the app when a beacon is seen
        String uuid = "MYCUSTOM UUID STRING";
        beaconManager.startRangingBeaconsInRegion(new Region(uuid, Identifier.parse(uuid), null, null));
    }
    catch (RemoteException e) {    }
}


我认为另一种解决方案是只进行监视,但是我需要获取“主要”和“次要”值....我可以通过监视活动来做到这一点吗?

最佳答案

您可以将监视与测距结合起来,以便仍然可以获得信标标识符。检查以下代码(我更改了您的代码)。

public void onBeaconServiceConnect() {
    beaconManager.setRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {

            if (beacons.size() > 0) {
                Beacon firstBeacon = beacons.iterator().next();
                Log.i(TAG, "The first beacon I see is about " + beacons.iterator().next().getDistance() + " meters away.");
            }
        }
    });

    beaconManager.setMonitorNotifier(new MonitorNotifier() {
        @Override
        public void didEnterRegion(Region region) {
            try {
                beaconManager.startRangingBeaconsInRegion(region);
            }
            catch (RemoteException e) {    }
        }

        @Override
        public void didExitRegion(Region region) {
            try {
                beaconManager.stopRangingBeaconsInRegion(region);
            }
            catch (RemoteException e) {    }
        }
    });


   try {
        Log.d(TAG, "setting up background monitoring for beacons and power saving");
        // wake up the app when a beacon is seen
        String uuid = "MYCUSTOM UUID STRING";
        beaconManager.startMonitoringBeaconsInRegion(new Region(uuid, Identifier.parse(uuid), null, null));
    }
    catch (RemoteException e) {    }
}


这样,使用didEnterRegion,您可以检查信标是否已进入您的区域,而使用didExitRegion,只要周围没有信标,您就可以获取信号(当然使用区域过滤器)。

但是,使用这种方法,如果在第一次启动监视时周围没有信标,您将无法获得事件。为此,您可以设置一个计时器并在didEnterRegion中设置一个标志。如果未在所需时间内设置该标志,则可以确保周围没有信标。除了第一次,这种方法应该可以解决您的问题。

10-06 07:53