我有一个应用程序可以使用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)
{
}
}
}
请帮忙
答案 0 :(得分:0)
下面的代码块中存在一些问题。当信标可见时,didRangeBeaconsInRegion
方法大约每秒调用一次。在该方法中,定义了与{em>第一个检测到的信标相匹配的新Region
,并在其上启动监控。
两个问题:
使用相同的区域标识符(Region
的第一个参数)每秒启动一次监控,有效地重新启动监控为该信标定义的区域。由于每秒都会针对单个区域重新启动监视,因此只要任何信标可见,就不可能让区域退出。当定义区域内的信标在10秒钟内未被发现时,就会退出某个区域。
代码块使用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
}
});
我建议只需在开始测量范围的同时更改代码以开始监视,而不是在didRangeBeaconsInRegion
回调中开始监视。像这样:
albeaconMnager.startRangingBeaconsInRegion(new org.altbeacon.beacon.Region("Regionid", null, null, null));
albeaconMnager.startMonitoringBeaconsInRegion(new org.altbeacon.beacon.Region("Regionid", null, null, null));