首页 文章

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

提问于
浏览
5

我正在使用此页面中的示例代码(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块之前,结果是一样的 .

我是否实施了错误的建议,或者是否有其他方法可以使其正常工作?

2 回答

  • 4

    如果您希望应用程序在信标检测上启动,那么 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
        }
     }
    

    EDIT: 我更新了库的参考应用程序,以显示如何成功完成此操作 . 看这里:https://github.com/AltBeacon/android-beacon-library-reference/blob/master/src/org/altbeacon/beaconreference/BeaconReferenceApplication.java

  • 0

    您可以实现 RangeNotifier 接口,并且可以访问在该接口的 public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region) 方法中捕获的所有信标信息 . 希望我的问题是正确的

相关问题