gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:44:48 26 4
gpt4 key购买 nike

我在“在后台启动应用程序”部分中使用此页面 ( 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 的建议,但没有成功。

编辑2:

更新代码以反射(reflect) davidgyoung 的建议。仍然没有运气。我在 didRangeBeaconsInRegion() 函数的第一行有一个 Log.d(),它没有被调用。

我尝试添加 BeaconManager.getInstanceForApplication(this).setRangeNotifier(this);在 try/catch block 之前,结果是一样的。

我是不是错误地实现了建议,或者是否有任何其他方法可以让它发挥作用?

最佳答案

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

关于java - 如何从 RegionBootstrap AltBeacon 方法中获取可见信标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25768326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com