如何获得从RegionBootstrap AltBeacon方法
可见标我使用这个页面(http://altbeacon.github.io/android-beacon-library/samples.html)在启动一个应用程序在背景部分的示例代码和我有一个工作程序。如何获得从RegionBootstrap AltBeacon方法
它会检测到信标在范围内,即使在背景上。
的问题是我需要知道哪个信标是它(UUID,主要,次要),以便然后匹配它我的本地数据库,并抛出一个通知,应用程序仍然在后台。
的didEnterRegion(地区区域)的功能只有一个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(本).setRangeNotifier(本);在try/catch块之前,结果是一样的。
我是否实施了错误的建议或是否有任何其他方式使其发挥作用?
您可以实现RangeNotifier
接口,并且您可以访问该接口的public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region)
方法中捕获的所有信标信息。希望我得到了正题吧
我在主类中实现了RangeNotifier,但它并未被RegionBootstrap在后台调用。 – 2014-09-10 15:34:52
我已更新我的回答以反映您的建议,因为它无效。让我知道你的意思是不同的事情,因为它还没有工作。 – 2014-09-10 15:39:26
噢好吧,我现在明白你的问题了!我认为你实际上不能从“RegionBootstrap”中获取信息,而是可以尝试创建与你的特定信标匹配的区域。Region Region = new Region(“NameOfTheBeacon”,“UUID”,“Major”,“Minor” );'这只会触发你的特定区域(你可以根据我的理解定义几个区域)。这只是一个提示,因为在我的应用程序中,我有一个服务在后台运行,实现'RangeNotifier',我检查所有可用的信标。 – FOliveira 2014-09-10 15:41:32
如果你想在应用启动本身的信标检测,那么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
我试过实现你的建议,现在反映在原始问题中。我的didRangeBeaconsInRegion()永远不会被调用。 我做错了什么,或者我错过了什么? – 2014-09-10 16:41:16
我没有看到你的代码有任何问题,并且我已经验证了这在我们的参考应用中有效。我将在明天发布我们的参考应用程序的更新副本,并添加一个链接到它的评论供您尝试。 – davidgyoung 2014-09-11 06:19:32
我已经得到它正常工作:)感谢您的支持 – 2014-09-11 19:10:35
你知道didEnterRegion被调用吗?尝试在顶部添加一条调试线。很明显,如果它没有被调用,你将无法成功开始测量这个设置。 – davidgyoung 2014-09-11 06:21:36
你解决了这个问题吗?我面临同样的问题。 – 2015-11-02 04:08:52