首页 文章

AltBeacon:当BeaconConsumer从DidEnterRegion绑定BootstrapNotifier回调时未调用onBeaconServiceConnect

提问于
浏览
1

我正在编写一个Android应用程序自定义类,它使用AltBeacon的Android-Beacon-Library .

我没有发布类,而是使用库提供的参考实现示例来重现问题 .

如果我在onCreate()中直接激活监视(通过实现RegionBootstrap)和测距beaconManager.bind(new BeaconConsumer()...),一切都很完美 .

但是我想开始测量 only when a Beacon enters region ,所以在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 回答

  • 2

    调用 bindBeaconConsumer() 在监视回调中不起作用的原因是因为在执行时,该类已绑定到该服务 . 如果您查看LogCat,您将看到有关此问题的警告消息 . 由于它已经绑定,因此代码不会回调 onBeaconServiceConnect() .

    为什么它已经绑定?由于以下行:

    regionBootstrap = new RegionBootstrap(this, region);
    

    RegionBootsrap 类在幕后执行绑定操作,该操作在一秒钟左右执行 .

    解决此问题的最简单方法是删除 didEnterRegion 方法中对 bindBeaconConsumer() 的调用,而只是调用 beaconManager.startRangingBeaconsInRegion(...) . 您不需要再次绑定,因为到那时,服务已经绑定 .

相关问题