didexit区域没有在android beacon中发射

时间:2015-08-11 11:51:35

标签: android ibeacon-android

我有一个应用程序可以使用android beacon库检测Ibeacons

我能够检测入口区域的信标。但退出区域代码并非全部正常工作。

1.首先,我将检测我的应用程序周围的所有信标 2.将开始监控每个信标

public void onBeaconServiceConnect() {
            // TODO Auto-generated method stub
            albeaconMnager.setRangeNotifier(new RangeNotifier() {

                @Override
                public void didRangeBeaconsInRegion(
                           Collection<org.altbeacon.beacon.Beacon> beacons,org.altbeacon.beacon.Region arg1) {
                           if(beacons.size()>0)
                           {
                              try {
                                       albeaconMnager.startMonitoringBeaconsInRegion(new  org.altbeacon.beacon.Region("Regionid", beacons.iterator().next().getId1(), beacons.iterator().next().getId2(), beacons.iterator().next().getId3()));
                        } catch (RemoteException e) {
                            // TODO Auto-generated catch bl
                           e.printStackTrace();
                        }


                    }

                    // TODO Auto-generated method stub

                }
            });

            albeaconMnager.setMonitorNotifier(new MonitorNotifier() {

                @Override
                public void didExitRegion(org.altbeacon.beacon.Region arg0)                  {
                    // TODO Auto-generated method stub
                    Log.i("tAG", "Exited Beacon!"+arg0.getUniqueId());   
                }

                @Override
                public void didEnterRegion(org.altbeacon.beacon.Region arg0) {
                    // TODO Auto-generated method stub
                                  connectToAppHandler(arg0.getId1().toString(),"entry");



                }

                @Override
                public void didDetermineStateForRegion(int state,
                        org.altbeacon.beacon.Region arg1) {
                    // TODO Auto-generated method stub

                    }
            });
            try {
                albeaconMnager.startRangingBeaconsInRegion(new org.altbeacon.beacon.Region("Regionid", null, null, null));
                //final Context context = this.getApplicationContext();

                } 
                catch (RemoteException e)
                    {  

                    }
            }
}

请帮忙

1 个答案:

答案 0 :(得分:0)

下面的代码块中存在一些问题。当信标可见时,didRangeBeaconsInRegion方法大约每秒调用一次。在该方法中,定义了与{em>第一个检测到的信标相匹配的新Region,并在其上启动监控。

两个问题:

  1. 使用相同的区域标识符(Region的第一个参数)每秒启动一次监控,有效地重新启动监控为该信标定义的区域。由于每秒都会针对单个区域重新启动监视,因此只要任何信标可见,就不可能让区域退出。当定义区域内的信标在10秒钟内未被发现时,就会退出某个区域。

  2. 代码块使用beacons.iterator.next()访问信标的方式只会获得测距回调中的第一个信标。如果可以看到多个信标,则可能会从一个方法回调更改为下一个方法,从而导致不确定的结果。

           @Override
            public void didRangeBeaconsInRegion(
                       Collection<org.altbeacon.beacon.Beacon> beacons,org.altbeacon.beacon.Region arg1) {
                       if(beacons.size()>0)
                       {
                          try {
                                   albeaconMnager.startMonitoringBeaconsInRegion(new  org.altbeacon.beacon.Region("Regionid", beacons.iterator().next().getId1(), beacons.iterator().next().getId2(), beacons.iterator().next().getId3()));
                    } catch (RemoteException e) {
                        // TODO Auto-generated catch bl
                       e.printStackTrace();
                    }
    
    
                }
    
                // TODO Auto-generated method stub
    
            }
        });
    
  3. 我建议只需在开始测量范围的同时更改代码以开始监视,而不是在didRangeBeaconsInRegion回调中开始监视。像这样:

    albeaconMnager.startRangingBeaconsInRegion(new org.altbeacon.beacon.Region("Regionid", null, null, null));
    albeaconMnager.startMonitoringBeaconsInRegion(new org.altbeacon.beacon.Region("Regionid", null, null, null));