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) { }