java – 如何从RegionBootstrap AltBeacon方法获取可见信标

我正在使用此页面上的示例代码(http://altbeacon.github.io/android-beacon-library/samples.html)在背景部分的启动应用程序中,我有一个正在运行的应用程序.

它会检测信标即使在背景上也在范围内.

问题是我需要知道它是哪个信标(UUID,Major,Minor)然后将它与我的本地数据库匹配并在应用程序仍然在后台发出通知.

didEnterRegion(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);
    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(Collectionteratorterator = 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块之前,结果是一样的.

我是否实施了错误的建议,还是有其他办法让这项工作成功?

最佳答案
如果您希望应用程序在信标检测上启动,那么RegionBootstrap是最简单的方法.为了将此与需要检测单个信标的Ranging结合起来,然后在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

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...