如何使用AltBeacon android-beacon-library检测多个信标的区域输入/退出?

时间:2014-08-09 21:47:58

标签: android ibeacon

我正在使用iBeacons并使用AltBeacon库。

beaconManager.getBeaconParsers()
             .add(new BeaconParser()
             .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));

我希望我的Android应用能够在信标进入和退出可见性时检测并生成事件。 使用方法使用库时,单个信标可以很好地工作。

public void **didEnterRegion**(Region region)

public void **didExitRegion**(Region region) 

我的问题是当多个信标同时可见时。 我试图维护一个所有信标可见的数组。 我想在每次信标进入和退出时生成一个事件。 该事件应通过其唯一标识符识别生成事件的信标。 我的信标可以使用beacon.getIdentifiers()或(UUID,Major和Minor)

进行唯一识别

问题是在所有信标退出该区域之前,didExitRegion方法才会执行。

有人能想到一种简单的方法让我使用AltBeacon库实现我的目标吗?

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:23)

两个选项:

  1. 设置一个不同的区域,仅匹配每个单独的信标,指定所有标识符,并监视每个信标。您将获得每个区域的不同进入和退出回调。

    Region region1 = new Region("myIdentifier1", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("1"));        
    Region region2 = new Region("myIdentifier2", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("2"));   
    
    beaconManager.startMonitoringBeaconsInRegion(region1);
    beaconManager.startMonitoringBeaconsInRegion(region2);    
    
  2. 启用范围,并将代码放入didRangeBeaconsInRegion回调中以跟踪各个信标。您可以使用java.util.HashMap来跟踪所有可见的信标(每个信号都显示最新时间的时间戳),然后如果您还没有看到信标,例如五秒钟,您可以从HashMap移除信标并执行该信标的退出逻辑。

  3. 选项1非常适合您预先知道其标识符的少数信标。选项2涉及更多,但对于大量信标或者如果您事先不知道它们的标识符则更好。

答案 1 :(得分:1)

/ ***************此守则用于估计信标***************** /

private  final Region ALL_ESTIMOTE_BEACONS_REGION = new Region("beaconall", null, null, null);

private BeaconManager beaconManager;

public  onCreate()
{

    beaconManager.connect(new BeaconManager.ServiceReadyCallback()
    {
        @Override
        public void onServiceReady()
        {
            Log.d("Lalit", "Beacon service Ready");

            beaconManager.startRanging(ALL_ESTIMOTE_BEACONS_REGION);
            beaconManager.startMonitoring(ALL_ESTIMOTE_BEACONS_REGION);
        }
    });
    beaconManager.setRangingListener(new BeaconManager.RangingListener() {
        @Override
        public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) {

            int index = beacons.size();
            // UUID uuid = UUID.fromString("");
            if (beacons.size() > 0) {
                Beacon SelectedBeacon = beacons.get(index-1);

                Log.d("Lalit", "Beacon Id :- " + SelectedBeacon.getProximityUUID());
                Log.d("Lalit", "Beacon major :- " + SelectedBeacon.getMajor());
                Log.d("Lalit", "Beacon miner :- " + SelectedBeacon.getMinor());
                Log.d("Lalit", "Beacon total :- " + beacons.size());
                Log.d("Lalit","Distance :- "+ getDistance(SelectedBeacon.getRssi(),SelectedBeacon.getMeasuredPower()));
            }

        }
    });

    beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener() {
        @Override
        public void onEnteredRegion(Region region, List<Beacon> list) {
            Calendar calendar = Calendar.getInstance();
            Date entertime = calendar.getTime();
            Log.d("Lalit", "Region Enter :- " + entertime);
            Log.d("List", "Region  UUID id :- " + region.getProximityUUID());
        }

        @Override
        public void onExitedRegion(Region region) {
            Calendar calendar = Calendar.getInstance();
            Date entertime = calendar.getTime();
            Log.d("Lalit", "Region exit :- " + entertime);
            Log.d("List", "Region  UUID id :- " + region.getProximityUUID());
        }
    });
}