AltBeacon:当 BeaconConsumer 从 DidEnterRegion BootstrapNotifier 回调绑定时,未调用 onBeaconServiceConnect
Posted
技术标签:
【中文标题】AltBeacon:当 BeaconConsumer 从 DidEnterRegion BootstrapNotifier 回调绑定时,未调用 onBeaconServiceConnect【英文标题】:AltBeacon : onBeaconServiceConnect not called when BeaconConsumer Binded From DidEnterRegion BootstrapNotifier callback 【发布时间】:2015-03-05 20:06:56 【问题描述】:我正在编写一个使用 AltBeacon 的 android-Beacon-Library 的 Android 应用自定义类。
我没有发布课程,而是使用库提供的参考实现示例来重现问题。
如果我直接在 onCreate() 中同时激活监控(通过实现 RegionBootstrap)和测距 beaconManager.bind(new BeaconConsumer()...),那么一切正常。
我想仅在 Beacon 进入区域时才开始测距,因此在 RegionBootstrap 的 didEnterRegion(Region arg0) 回调中,但是当我这样做时,永远不会调用 onBeaconServiceConnect()。我相信这样做在电池消耗方面会更有效。
我尝试在主线程上强制执行以及使用延迟计时器,但没有成功。
任何人都可以让它工作吗?任何帮助表示赞赏!
public class BeaconReferenceApplication extends Application implements BootstrapNotifier
private static final String TAG = "AndroidProximityReferenceApplication";
private RegionBootstrap regionBootstrap;
private BackgroundPowerSaver backgroundPowerSaver;
BeaconManager beaconManager;
Context context = this;
public void onCreate()
super.onCreate();
beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
// Setup beacon layout - should be done once only
List<BeaconParser> bp = beaconManager.getBeaconParsers();
bp.add(new BeaconParser().setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));
Region region = new Region("backgroundRegion", null, null, null);
regionBootstrap = new RegionBootstrap(this, region);
backgroundPowerSaver = new BackgroundPowerSaver(this);
// THIS WORKS
bindBeaconConsumer();
public void bindBeaconConsumer()
beaconManager.bind(new BeaconConsumer()
@Override
public void onBeaconServiceConnect()
// ISSUE : Does not pass here when bindBeaconConsumer() is called from didEnterRegion
// Set Range Notifier and start ranging
@Override
public Context getApplicationContext()
return context;
@Override
public void unbindService(ServiceConnection serviceConnection)
context.unbindService(serviceConnection);
@Override
public boolean bindService(Intent intent, ServiceConnection serviceConnection, int i)
return context.bindService(intent, serviceConnection, i);
);
@Override
public void didEnterRegion(Region arg0)
Log.d(TAG, "did enter region.");
// THIS DOESN'T WORK : onBeaconServiceConnect() never called
// bindBeaconConsumer();
@Override
public void didExitRegion(Region region)
@Override
public void didDetermineStateForRegion(int state, Region region)
【问题讨论】:
【参考方案1】:在监控回调中调用bindBeaconConsumer()
不起作用的原因是在它执行时,该类已经绑定到服务。如果您查看 LogCat,您将看到一条关于此的警告消息。由于它已经被绑定,代码不会得到对onBeaconServiceConnect()
的回调。
为什么已经绑定了?因为下面一行:
regionBootstrap = new RegionBootstrap(this, region);
RegionBootsrap
类在后台执行绑定操作,大约一秒钟后执行。
解决此问题的最简单方法是在didEnterRegion
方法中删除对bindBeaconConsumer()
的调用,而只调用beaconManager.startRangingBeaconsInRegion(...)
。您无需再次绑定,因为此时服务已经绑定。
【讨论】:
以上是关于AltBeacon:当 BeaconConsumer 从 DidEnterRegion BootstrapNotifier 回调绑定时,未调用 onBeaconServiceConnect的主要内容,如果未能解决你的问题,请参考以下文章
AltBeacon:如何使用 AltBeacon Lib 获取广告标志(例如 BR/EDR)?
使用 AltBeacon 库以 CoreBluetooth 格式做广告
如何使用 android-beacon-library (altbeacon) 正确停止扫描信标
OnyxBeacon 的 AltBeacon 不稳定,反复循环通过 didEnterRegion 和 didExitRegion