【问题标题】:AltBeacon : onBeaconServiceConnect not called when BeaconConsumer Binded From DidEnterRegion BootstrapNotifier callbackAltBeacon:当 BeaconConsumer 从 DidEnterRegion BootstrapNotifier 回调绑定时,未调用 onBeaconServiceConnect
【发布时间】:2025-12-21 02:55:06
【问题描述】:

我正在编写一个使用 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) {
    }
}

【问题讨论】:

    标签: android ibeacon ibeacon-android android-ibeacon


    【解决方案1】:

    在监控回调中调用bindBeaconConsumer() 不起作用的原因是在它执行时,该类已经绑定到服务。如果您查看 LogCat,您将看到一条关于此的警告消息。由于它已经被绑定,代码不会得到对onBeaconServiceConnect() 的回调。

    为什么已经绑定了?因为下面一行:

    regionBootstrap = new RegionBootstrap(this, region);
    

    RegionBootsrap 类在后台执行绑定操作,大约一秒钟后执行。

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

    【讨论】:

      最近更新 更多