【发布时间】:2014-09-10 14:39:50
【问题描述】:
我正在使用此页面 (http://altbeacon.github.io/android-beacon-library/samples.html) 中的“在后台启动应用程序”部分中的示例代码,并且我有一个工作应用程序。
它检测到信标是否在范围内,即使在背景上也是如此。
问题是我需要知道它是哪个信标(UUID、Major、Minor),然后将其与我的本地数据库进行匹配,并在应用仍处于后台时发出通知。
didEnterRegion(Region region) 函数只有一个 matchesBeacon 方法,我尝试执行以下操作来识别哪些信标正在被看到,但它抛出了 NullPointerException:
public class SightSeeing extends Activity implements BootstrapNotifier, RangeNotifier {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Region region = new Region("sightRegion", null, null, null);
regionBootstrap = new RegionBootstrap(this, region);
BeaconManager.getInstanceForApplication(this).getBeaconParsers().add(
new BeaconParser(). setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")
);
BeaconManager.getInstanceForApplication(this).setRangeNotifier(this);
}
@Override
public void didEnterRegion(Region region) {
regionBootstrap.disable();
BeaconManager.getInstanceForApplication(this).setRangeNotifier(this);
try {
BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(region);
}
catch (RemoteException e) {
Log.e(TAG, "Can't start ranging");
}
}
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
Iterator<Beacon> beaconIterator = beacons.iterator();
while (beaconIterator.hasNext()) {
Beacon beacon = beaconIterator.next();
//check if beacon exists in our DB and throw notification
}
}
}
我是否遗漏了一些明显的东西,或者这个库不可能做到这一点?
编辑:
我已经更新了代码示例,以便为你们提供更广泛的想法,并且我尝试实施 FOliveira 的建议,但没有任何成功。
EDIT2:
更新了代码以反映 davidgyoung 的建议。仍然没有运气。我在 didRangeBeaconsInRegion() 函数的第一行有一个 Log.d() ,它没有被调用。
我尝试添加 BeaconManager.getInstanceForApplication(this).setRangeNotifier(this);在 try/catch 块之前,结果是一样的。
我是否错误地执行了该建议,或者是否有任何其他方法可以使其正常工作?
【问题讨论】:
-
你知道 didEnterRegion 被调用了吗?尝试在其顶部添加调试行。显然,如果不调用它,您将无法使用此设置成功开始测距。
-
这个问题你解决了吗?我面临同样的问题。
标签: java android ibeacon ibeacon-android altbeacon