如何获得从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块之前,结果是一样的。

我是否实施了错误的建议或是否有任何其他方式使其发挥作用?

+0

你知道didEnterRegion被调用吗?尝试在顶部添加一条调试线。很明显,如果它没有被调用,你将无法成功开始测量这个设置。 – davidgyoung 2014-09-11 06:21:36

+0

你解决了这个问题吗?我面临同样的问题。 – 2015-11-02 04:08:52

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

+0

我在主类中实现了RangeNotifier,但它并未被RegionBootstrap在后台调用。 – 2014-09-10 15:34:52

+0

我已更新我的回答以反映您的建议,因为它无效。让我知道你的意思是不同的事情,因为它还没有工作。 – 2014-09-10 15:39:26

+0

噢好吧,我现在明白你的问题了!我认为你实际上不能从“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

+0

我试过实现你的建议,现在反映在原始问题中。我的didRangeBeaconsInRegion()永远不会被调用。 我做错了什么,或者我错过了什么? – 2014-09-10 16:41:16

+0

我没有看到你的代码有任何问题,并且我已经验证了这在我们的参考应用中有效。我将在明天发布我们的参考应用程序的更新副本,并添加一个链接到它的评论供您尝试。 – davidgyoung 2014-09-11 06:19:32

+0

我已经得到它正常工作:)感谢您的支持 – 2014-09-11 19:10:35