Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从RegionBootstrap AltBeacon方法获取可见信标_Java_Android_Ibeacon_Ibeacon Android_Altbeacon - Fatal编程技术网

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

Java 如何从RegionBootstrap AltBeacon方法获取可见信标,java,android,ibeacon,ibeacon-android,altbeacon,Java,Android,Ibeacon,Ibeacon Android,Altbeacon,我在后台启动一个应用程序部分使用了这个页面()上的示例代码,我已经有了一个可用的应用程序 只要信标在范围内,即使在背景上,它也会检测 问题是我需要知道它是哪个信标(UUID、Major、Minor),然后将其与我的本地数据库进行匹配,并在应用程序仍在后台的情况下抛出通知 didEnterRegion(Region Region)函数只有一个matchesBeacon方法,我尝试执行以下操作以确定哪些信标被看到,但它抛出了NullPointerException: public class Sig

我在后台启动一个应用程序部分使用了这个页面()上的示例代码,我已经有了一个可用的应用程序

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

问题是我需要知道它是哪个信标(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
        }
    }
}
public类活动实现BootstrapNotifier、RangeNotifier{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
区域区域=新区域(“视觉区域”,空,空,空);
regionBootstrap=新的regionBootstrap(此,区域);
BeaconManager.getInstanceForApplication(this).getBeaconParsers().add(
新建BeaconParser().setBeaconLayout(“m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24”)
);
BeaconManager.getInstanceForApplication(this).setRangeNotifier(this);
}
@凌驾
公共区域(区域){
regionBootstrap.disable();
BeaconManager.getInstanceForApplication(this).setRangeNotifier(this);
试一试{
BeaconManager.getInstanceForApplication(this).StartTrangBeaconsis区域(region);
}
捕获(远程异常){
Log.e(标记“无法开始测距”);
}
}
@凌驾
公共无效范围信标区域(收集信标,区域){
如果(beacons.size()>0){
迭代器信标迭代器=信标迭代器();
while(beaconIterator.hasNext()){
信标=信标计数器。下一步();
//检查我们的数据库中是否存在信标并抛出通知
}
}
}
我是否遗漏了一些明显的东西,或者这个库不可能做到这一点

编辑:

我已经更新了代码示例,为大家提供了更广泛的想法,并且我尝试实现FOliveira的建议,但没有成功

编辑2:

更新了代码以反映davidgyoung的建议。仍然不走运。我在didRangeBeaConsincinRegion()函数的第一行有一个Log.d(),没有调用它

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


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

您可以执行
RangeNotifier
界面,并且可以访问
public void DidRangeBeaconsis区域(收集信标,区域)中捕获的所有信标信息
该接口的方法。希望我答对了问题

如果你想让应用程序在信标检测时自动启动,那么
RegionBootstrap
是最简单的方法。为了将其与检测单个信标所需的测距结合起来,然后在
DiEnterRegion
方法中添加如下代码:

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
    }
 }
for(int i=0;i

编辑:我已更新了库的参考应用程序,以展示如何成功完成此操作。请参见此处:

我已在主类中实现了RangeNotifier,但没有被RegionBootstrap在后台调用。我已更新了我的答案以反映您的建议,因为它不起作用。如果您是说因为它还不起作用,所以不是另一回事。哦,好吧,我现在明白你的问题了!我想你实际上无法从
RegionBootstrap
中获取信息,相反,你可以尝试创建与你的特定信标相匹配的区域
Region Region=new Region(“Beacon的名称”、“UUID”、“Major”、“Minor”)
只会在您的特定区域触发(据我所知,您可以定义几个区域)。这只是一个提示,因为在我的应用程序中,我有一个在后台运行的服务,它实现了
RangeNotifier
,我检查了所有可用的信标。您是如何在不使用RegionBootstrap的情况下实现该服务的?这正是我需要的。首先,您需要在没有后台的情况下投入工作!尝试实现
BeaconConsumer
接口,并在您的
onCreate
方法中执行
BeaconManager.bind(this);
操作。之后,将
onCreate
的代码移动到
public void onbeacerviceconnect()
新方法。在运行的应用程序上,这对我来说很有效。我已经尝试实现了您的建议,如原始问题所反映的。My DidRangeBeanConsincinRegion()从未调用。我是做错了什么还是遗漏了什么?我没有发现你的代码有任何其他错误,我已经验证了这在我们的参考应用程序中是有效的。明天我将发布我们参考应用程序的更新副本,并添加一个链接到它的注释,供你尝试。我已经让它正常工作:)感谢你对t的支持记录中,我已更新了参考应用程序,以显示如何成功完成此操作。请参见此处:我已尝试执行相同的操作,但在启动
StarTrangBeaconRegion(region);
:无法启动测距-BeaconManager未绑定到服务。请调用BeaconManager.bind(BeaconConsumer consumer consumer)然后等待对onBeaconServiceConnect()的回调,您知道didEnterRegion正在被c调用吗