我正在使用AltBeacon库来检测iBeacon设备。这是我使用的代码,基于AltBeacon的文档,但未检测到信标:
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
beaconManager.bind(this);
beaconManager.addMonitorNotifier(new MonitorNotifier() {
@Override
public void didEnterRegion(Region region) {
Log.i("test", "I just saw an beacon for the first time!");
}
@Override
public void didExitRegion(Region region) {
Log.i("test", "I no longer see an beacon");
}
@Override
public void didDetermineStateForRegion(int state, Region region) {
Log.i("test", "I have just switched from seeing/not seeing beacons: "+state);
}
});
try {
beaconManager.startMonitoringBeaconsInRegion(new Region("e2c56db5-dffb-48d2-b060-d0f5a71096e0", null, null, null));
} catch (RemoteException e) { }
这段代码错了吗?
答案 0 :(得分:1)
两个问题:
问题1:
当您致电beaconManager.bind(this);
时,封闭类必须是BeaconConsumer
的实例(通常是Application
或Activity
的实例,否则您需要链接{{1}方法。)
关键是你只能调用这个块:
BeaconConsumer
收到
try {
beaconManager.startMonitoringBeaconsInRegion(new Region("e2c56db5-dffb-48d2-b060-d0f5a71096e0", null, null, null));
} catch (RemoteException e) { }
的回复后。此代码通常应该在该回调中。因为异常块是空的并且什么都不记录,所以我怀疑代码抛出了这个异常并且无声地失败。您应始终至少在异常块中记录错误,以帮助查找此类问题。
问题2:
区域的构造函数应如下所示:
onBeaconServicecConnected
请注意,第一个参数是一个字符串,用作区域的唯一标识符,以便稍后使用相同的标识符来停止或替换受监视的区域。第二个参数是ProximityUUID,第三个和第四个参数分别是主要和次要参数。
在显示的代码中构造标识符的方式应该有效,因为它定义了一个唯一的id“e2c56db5-dffb-48d2-b060-d0f5a71096e0”,ProximityUUID / major / minor值都是null,因此是通配符。然而,这是误导性的,因为它表明它正在寻找特定的ProximityUUID,而不是。