【问题标题】:How to get visible beacons from the RegionBootstrap AltBeacon method如何从 RegionBootstrap AltBeacon 方法中获取可见信标
【发布时间】:2014-09-10 14:39:50
【问题描述】:

我正在使用此页面 (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 块之前,结果是一样的。

我是否错误地执行了该建议,或者是否有任何其他方法可以使其正常工作?

【问题讨论】:

  • 你知道 didEnterRegion 被调用了吗?尝试在其顶部添加调试行。显然,如果不调用它,您将无法使用此设置成功开始测距。
  • 这个问题你解决了吗?我面临同样的问题。

标签: java android ibeacon ibeacon-android altbeacon


【解决方案1】:

如果您希望应用程序在检测到信标时自行启动,那么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() 从未被调用过。我做错了什么还是错过了什么?
  • 我没有发现您的代码有任何其他问题,并且我已经验证这在我们的参考应用程序中有效。明天我将发布我们参考应用的更新副本,并添加评论链接供您试用。
  • 我已经让它正常工作了 :) 感谢您的支持
  • 作为记录,我已经更新了参考应用程序以显示如何成功完成此操作。见这里:github.com/AltBeacon/android-beacon-library-reference/blob/…
  • 我也尝试过这样做,但是当我启动 startRangingBeaconsInRegion(region); 时出现异常:无法开始测距 - BeaconManager 未绑定到服务。调用 beaconManager.bind(BeaconConsumer consumer) 并等待回调到 onBeaconServiceConnect()
【解决方案2】:

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

【讨论】:

  • 我已经在主类中实现了 RangeNotifier,但它没有被后台的 RegionBootstrap 调用。
  • 我已更新我的答案以反映您的建议,因为它不起作用。如果您的意思不同,请告诉我,因为它还没有工作。
  • 哦好的,我现在明白你的问题了!我认为您实际上无法从RegionBootstrap 获取信息,相反,您可以尝试创建与您的特定信标Region region = new Region("NameOfTheBeacon", "UUID", "Major", "Minor"); 匹配的区域,这只会在您的特定区域触发(据我所知,您可以定义几个)。这只是一个提示,因为在我的应用程序中,我有一个在后台运行的服务,它实现了RangeNotifier,并且我检查了所有可用的信标。
  • 您是如何在不使用 RegionBootstrap 的情况下实现该服务的?这看起来正是我需要的。
  • 首先你需要在没有背景的情况下投入工作!尝试实现BeaconConsumer 接口并在您的onCreate 方法中执行BeaconManager.bind(this);。之后,将onCreate 的代码移动到public void onBeaconServiceConnect() 新方法中。这对我有用,在一个正在运行的应用程序上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多