AltBeacon有时不能射程

时间:2017-04-27 21:32:44

标签: android altbeacon beacon estimote

我希望我的应用程序始终跟踪信标

它开始跟踪似乎工作很好

之后,didRangeBeaconsInRegion()有一个空的信标集合

这是我的代码

public void onCreate() {
        super.onCreate();
        Log.d(TAG, "create");

        beaconManager = BeaconManager.getInstanceForApplication(this);

        try {
            beaconManager.getBeaconParsers().clear();
            beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
            beaconManager.setBackgroundScanPeriod(1101l);
            beaconManager.setBackgroundBetweenScanPeriod(1101l);
            beaconManager.setForegroundBetweenScanPeriod(1101l);
            beaconManager.updateScanPeriods();
        } catch (RemoteException e) { }

        backgroundPowerSaver = new BackgroundPowerSaver(this);
        startBeaconRanging();
    }

    public void startBeaconRanging() {
        courseId = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString(getString(R.string.course_id), "");
        Log.d(TAG, "startBeaconRanging on courseId = " + courseId);

        if (!courseId.equals("")) {
            syncBeaconWithFirebase(courseId);
            endTime = CourseSQLiteManager.getColumnById(getApplicationContext(), courseId, COURSE_ENDTIME);
            regionBootstrap = new RegionBootstrap(this, new Region("ranged region", null, null, null));
        }

    }

    public void stopBeaconRanging() {
        if (regionBootstrap != null) {
            regionBootstrap.disable();
            try {
                Log.d(TAG, "end");
                courseId = "";
                beaconManager.stopRangingBeaconsInRegion(getRegion());
                beaconManager.removeAllRangeNotifiers();
            } catch (RemoteException e) { }
        }
    }

    @Override
    public void didEnterRegion(Region region) {
        Log.d(TAG, "enter");
        try {
            Region r = getRegion();
            if(r == null) {
                regionBootstrap = new RegionBootstrap(this, new Region("ranged region", null, null, null));
                Log.d(TAG, "null");
            }
            if(r != null) {
                beaconManager.startRangingBeaconsInRegion(r);
                beaconManager.addRangeNotifier(this);
            }
        } catch (RemoteException e) {    }
    }

    @Override
    public void didExitRegion(Region region) {
        try {
            if(getRegion() != null) beaconManager.stopRangingBeaconsInRegion(getRegion());
        } catch (RemoteException e) {    }
    }

    @Override
    public void didDetermineStateForRegion(int i, Region region) {

    }

    @Override
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
        if(beacons.size() > 0) {
            Beacon beacon = beacons.iterator().next();
            Log.d(TAG, beacon.getId2().toInt() + " " + beacon.getDistance() + " " + beacon.getRssi());

            if(isAfterEndTime()) {
                stopBeaconRanging();
            }
        }
    }
编辑:这就像前景和背景一样。但如果我杀了我的应用并再次打开它,我可以找到灯塔,但也只是片刻。

EDIT2:isAfterEndTime返回false,但找不到任何信标。但didExitRegion触发与didEnterRegion交换,并找到零信标

PS。我想一次只跟踪一个信标

PS.2抱歉我的英语不好。我不确定,你能得到我想要清楚的问题吗?

1 个答案:

答案 0 :(得分:0)

要检查的一些事项:

  • 确保未触发此代码。我看不到方法的定义,但如果它返回true,则会导致范围停止:

        if(isAfterEndTime()) {
            stopBeaconRanging();
        }
    
  • didExitRegion中添加调试行,以确保没有调用它。 (因为它也会停止测距。)顺便说一句,我认为你不需要这样做的代码 - 如果你还没有检测到信标,那么只需继续测距就没有效率成本。

  • 确保此行代码只执行一次,因为RegionBootstrap不是设计为重复创建的:

    regionBootstrap = new RegionBootstrap(this, new Region("ranged region", null, null, null));
    

不要重复创建一个新的RegionBootstrap对象,只需在程序开头创建一个。如果您想要更改受监控的区域,可以使用beaconManager.stopMonitoringBeaconsInRegion(region1);beaconManager.startMonitoringBeaconsInRegion(region2);

进行更改