Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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
Android Alt Beacon Library、RegionBootstrap和BeaconManager同时工作_Android_Beacon_Altbeacon - Fatal编程技术网

Android Alt Beacon Library、RegionBootstrap和BeaconManager同时工作

Android Alt Beacon Library、RegionBootstrap和BeaconManager同时工作,android,beacon,altbeacon,Android,Beacon,Altbeacon,我有一个信标的背景扫描,我已经包括在我的应用程序类中,如中所述 以下是我为清晰起见而编写的代码: public class MyApplication extends Application implements BootstrapNotifier { public static final String TAG = MyApplication.class .getSimpleName(); private RequestQueue mRequestQueue; privat

我有一个信标的背景扫描,我已经包括在我的应用程序类中,如中所述

以下是我为清晰起见而编写的代码:

public class MyApplication extends Application implements BootstrapNotifier {
public static final String TAG = MyApplication.class
        .getSimpleName();

private RequestQueue mRequestQueue;

private static MyApplication mInstance;
private BackgroundPowerSaver backgroundPowerSaver;
public RegionBootstrap regionBootstrap;
private BroadcastReceiver br;


@Override
public void onCreate() {
    super.onCreate();
    mInstance = this;
    BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
    backgroundPowerSaver = new BackgroundPowerSaver(mInstance);
    //beaconManager.setDebug(true);
    //beaconManager.setBackgroundBetweenScanPeriod(5000); //Background Scanning rate frequency

    //initRegions(getApplicationContext());


}
........
public void initRegions(Context context)
{


    System.out.println("Inside initRegions");
    ArrayList<BeaconClass> b_a = ind_constants.getPOIList(getApplicationContext());
    try {
        if (b_a.size() > 0) {
            List<Region> list_region = new ArrayList<>();

            for (int i = 0; i < b_a.size(); i++) {
                Beacon b = new Beacon.Builder().setId1(b_a.get(i).id1).setId2(b_a.get(i).id2).setId3(b_a.get(i).id3).build();
                Region region = new Region("Region " + b.getId1(), b.getId1(), b.getId2(), b.getId3());
                list_region.add(region);
                System.out.println("Region added. " + b.getId1());
            }
            System.out.println("A");
            regionBootstrap = new RegionBootstrap(mInstance, list_region);
            System.out.println("B");

        }
        Log.d("in", "Initialized the regions as per the POI List");
    }
    catch (NullPointerException e)
    {
        Log.d("in","Region has not been initialized yet.");
    }
}
.......
public void disableBackgroundMonitoring()
{
    if(regionBootstrap != null) {
        regionBootstrap.disable();
        regionBootstrap = null;
    }
}

public void disableBackgroundMonitoring()
{
    if(regionBootstrap != null) {
        regionBootstrap.disable();
        regionBootstrap = null;
    }
}

@Override
public void didEnterRegion(Region region) {
    Log.d("in", "Got a didEnterRegion call for "+region.getUniqueId());
    //Send trigger
}

@Override
public void didExitRegion(Region region) {
    Log.d("in", "Got a ExitRegion call for "+region.getUniqueId());
    //EventBus.getDefault().postSticky(new TriggerEvent(0,"Exited the region "+region.getUniqueId(),false));
    //Send Trigger
}

@Override
public void didDetermineStateForRegion(int l, Region region) {
    Log.d("in", "didDetermineStateForRegion "+region.getUniqueId()+" state is : "+l);

}
让我们将RegionBootstrap称为
后台扫描
,将服务称为
测距
。现在的问题是:

a) 如果我初始化RegionBootstrap,并在从
didEnterRegion
didExitRegion
获取触发器后,启动测距服务,它不会启动,即,我收到一个错误,说明
消费者已绑定
。基本上,
背景扫描
可以工作,或者
测距
。我不确定这是否是预期的情况

b) 如代码中所示,在绑定
beaconmanager
之前,我会检查并禁用
后台扫描
解除绑定
服务
beaconmanager
。这是第一次工作,但在我停止服务后,我调用下面的函数

public void stopBLEScan(Context context)
    {
        try {
            beaconManager.unbind(B.this);
            Log.d(Tag,"BLE Scan has been disabled.");
            beaconManager.removeAllRangeNotifiers();

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        h.removeCallbacks(runnable);
    }
现在停止BleScan后,如果我重新启动
MyApplication.getInstance().initRegions(getApplicationContext()),它在android设备中创建通知,尽管我设置通知生成器的服务从未调用过。基本上,我在重新输入<代码>背景扫描后,在logcat中得到下面的消息

I/BeaconManager: Starting foreground beacon scanning service.
c) 现在,即使在我收到通知后,如果我启动
测距
服务,有时我会得到“消费者已绑定”

如果我是对的,我想,
RegionBootstrap
ranging
可以同时工作

基本上要遵循的顺序是开始背景扫描
停止背景扫描
开始测距
停止测距
开始背景扫描

次要问题:在
DidRangeBeaconsis区域
中,当我对信标进行测距时,我必须添加以下代码:

beaconManager.removeAllRangeNotifiers();
    try {
        beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
        beaconManager.addRangeNotifier(rangeNotifier);

    } catch (RemoteException e) {   }
否则不会检测到信标。我不明白为什么要加上这个?即使我们不得不这么做,有多少次?在您的参考应用程序中,您已经这样做了两次。如何确定我们要做多少次

非常感谢您的帮助


感谢

RegionBootstrap
是一个方便的类,设计用于在自定义Android
应用程序
类中设置信标监控,以便在后台重新启动应用程序。它设计为在
应用程序#onCreate
方法中设置一次,并且不受影响。它不是为以后重新初始化而设计的

如果您想动态启动和停止监控,我建议您不要在其设计用途之外使用
RegionBootstrap


相反,调用
beaconManager.bind(…)
然后在
onbeacerviceconnected
回调中,调用
beaconManager.startMonitoringbeaconRegion(…)
。您可以稍后使用
beaconManager停止监视。停止监视BeaconsinRegion(…)
,然后可以使用
beaconManager.unbind(…)
解除绑定(如果需要)。在绑定和解除绑定的调用中,您需要传递一个
beaconsumer
。绑定/取消绑定的调用必须匹配,否则您将收到错误消息。

因此,如果我的应用程序类中有
RegionBootstrap
,那么我无法在Android 8+中开始测距?您可以同时测距和监视区域是的。事实上,参考应用程序准确地展示了如何做到这一点。但您不需要停止监视就可以开始测距(您可以让监视保持开启状态)。如果你确实想出于某种原因停止监视,就不要使用
RegionBootstrap
,而是使用
beaconManager.startMonitoringbeaconregion(…)
/
beaconManager.stopMonitoringbeaconregion(…)
正如我所说,我正在尝试
startMonitoringbeaconregion
的东西,但我有一个问题。为什么在上述情况下,
RegionBootstrap
仍在运行时,我试图绑定
beaconconsumer
时出现“consumer is ready bound”错误。在StackOverflow上调试较大的程序非常困难——这个问题包含175行代码。我建议尝试创建一个更小的极简主义样本来重现这个问题。最好是40行或更少。
beaconManager.removeAllRangeNotifiers();
    try {
        beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
        beaconManager.addRangeNotifier(rangeNotifier);

    } catch (RemoteException e) {   }