我正在编写一个使用AltBeacon的Android-Beacon-Library的Android App自定义类。
我没有发布课程,而是使用随库提供的参考实现示例来重现问题。
如果我在onCreate()中直接激活监视(通过实现RegionBootstrap)和测距beaconManager.bind(新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) {
}
}
答案 0 :(得分:2)
调用bindBeaconConsumer()
的原因在监视回调中不起作用是因为在执行时,该类已绑定到该服务。如果您查看LogCat,您将看到有关此问题的警告消息。由于它已经绑定,因此代码无法回调onBeaconServiceConnect()
。
为什么它已经绑定?由于以下几行:
regionBootstrap = new RegionBootstrap(this, region);
RegionBootsrap
类在幕后执行绑定操作,在大约一秒钟内执行。
解决此问题的最简单方法是删除bindBeaconConsumer()
方法中对didEnterRegion
的调用,而只是调用beaconManager.startRangingBeaconsInRegion(...)
。您不需要再次绑定,因为到那时,服务已经绑定。