我使用的是本页上的示例代码(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的建议,但没有成功。
第2版:
更新代码以反映davidgyong的建议。仍然没有运气。我在didRangeBeaconsIn()函数的第一行有一个Log.d(),它没有被调用。
我已经尝试添加BeaconsManager.getInstanceForApplication(this).setRangeNotificationer(this);在try/catch块之前,结果是相同的。
我是不是执行错了这个建议,或者有其他方法可以让它发挥作用?
如果您希望应用程序在信标检测时自行启动,那么RegionBootstrap
是最简单的方法。为了将其与检测单个信标所需的测距相结合,请在didEnterRegion
方法中添加代码,如下所示:
try {
BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(region);
}
catch (RemoteException e) {
Log.e(TAG, "Can't start ranging");
}
然后像您所做的那样实现一个测距回调。
您还需要删除下面的代码,这可能是导致NullPointerException
的原因,因为:
for(int i=0; i< beaconsList.size(); i++) {
Beacon b = new Beacon.Builder()
.setId1(beaconsList.get(i).get("uuid"))
.setId2(beaconsList.get(i).get("major"))
.setId3(beaconsList.get(i).get("minor"))
.build();
if(region.matchesBeacon(b)) {
//get info from DB and throw notification
}
}
编辑:我已经更新了库的参考应用程序,以展示如何成功完成这项工作。请参见此处:https://github.com/AltBeacon/android-beacon-library-reference/blob/master/src/org/altbeacon/beaconreference/BeaconReferenceApplication.java
您可以实现RangeNotifier
接口,并且您可以访问该接口的public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region)
方法中捕获的所有信标信息。希望我答对了