信标和区域的正确使用方法
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 将为该区域触发。
使用 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 将为该区域触发。