Android 无法使用Albeacon库找到信标

Android 无法使用Albeacon库找到信标,android,beacon,altbeacon,Android,Beacon,Altbeacon,我创建了一个android应用程序,用于扫描信标。出于测试目的,我使用Albeacon库创建了一个用于扫描信标的活动开始,然后显示信标ID,但它似乎不起作用。这是我的密码: private void init() { try { if (beaconManager != null && monitoringRegion != null) { displayOnActivity("

我创建了一个android应用程序,用于扫描信标。出于测试目的,我使用Albeacon库创建了一个用于扫描信标的活动开始,然后显示信标ID,但它似乎不起作用。这是我的密码:

   private void init() {
            try {
                if (beaconManager != null && monitoringRegion != null) {
                    displayOnActivity("Already running");
                    return;
                }
                displayOnActivity("starting with init method..");
              beaconManager = BeaconManager.getInstanceForApplication(this);

                beaconManager.setBackgroundScanPeriod(3000l);
                beaconManager.setBackgroundBetweenScanPeriod(0);;

                 beaconManager.updateScanPeriods();

            beaconManager.setRangeNotifier(RANGE_NOTIFIER);
                beaconManager.setUseTrackingCache(false);
             backgroundPowerSaver = new BackgroundPowerSaver(this);

             monitoringRegion = new Region("DefaultRegion", null, null, null);
                 beaconManager.bind(this);
                beaconManager.startMonitoringBeaconsInRegion(monitoringRegion);
                beaconManager.startRangingBeaconsInRegion(monitoringRegion);

            } catch (Exception e) {
                Log.e(TAG, "unable to start beacon monitoring.. ", e);
            }
        }

 @Override
    public void onBeaconServiceConnect() {
        displayOnActivity("onBeaconServiceConnect activated");
        beaconManager.removeAllMonitorNotifiers();
        beaconManager.addMonitorNotifier(new MonitorNotifier() {
            @Override
            public void didEnterRegion(Region region) {
                Log.d(TAG, "BeaconApplication got enter region observation");
                try {
                    if (beaconManager != null)
                        beaconManager.startRangingBeaconsInRegion(region);
                } catch (Exception e) {
                    Log.e(TAG, "Exception while ranging beacon", e);
                 }
            }

            @Override
            public void didExitRegion(Region region) {
                displayOnActivity("Exit region with beacon");
                try {
                    if (beaconManager != null)
                        beaconManager.stopRangingBeaconsInRegion(region);
                    flushBeaconsNotificationsForRegion(Calendar.getInstance().getTimeInMillis());

                } catch (Exception e) {
                    Log.e(TAG, "Exception while stop ranging beacon", e);
                 }
            }

            @Override
            public void didDetermineStateForRegion(int state, Region region) {
            }
        });

        try {
            if (monitoringRegion != null)
                beaconManager.startMonitoringBeaconsInRegion(monitoringRegion);
        } catch (RemoteException e) {
            Log.e(TAG, "Error while startMonitoringReagion.. " + e);
        }
    }


 final RangeNotifier RANGE_NOTIFIER = new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {

            for (Beacon beacon : beacons) {
                String beaconKey = beacon.getId1().toString();
                if (!beaconIdToSeenTimestampMap.containsKey(beaconKey)) {
                    long fromTimestamp = Calendar.getInstance().getTimeInMillis();
                    displayOnActivity("Beacon " + beaconKey + " discovered");
                    beaconIdToSeenTimestampMap.put(beaconKey, fromTimestamp);
                    beaconsRSSISamplingMap.put(beaconKey, Collections.<Integer>emptyList());
                }

            }
        }
    };

有人能告诉我没有显示结果的原因吗?

尝试将代码移动到onBeavonServiceConnected中开始监视和测距

了解绑定调用是异步的,如果未完成,将记录此错误:

Log.e(TAG, "unable to start beacon monitoring.. ", e);
其他需要检查的事项:

确保已授予您位置权限。这必须在Android 6+上的代码中从用户处动态获取

确保蓝牙和位置已打开


我通过改变targetSdkVersion=21解决了这个问题。因为我在清单文件中拥有所有必需的权限,但不知道为什么在gradle文件中将targetSdkVersion设置为24时它不工作。这可能是因为我的应用程序在后台运行,所以蓝牙后台扫描在较新的SDKversion中受到android的限制。当谷歌发布android 6时,他们允许使用targetSdkVersion 22及更早版本的应用程序在前台扫描蓝牙,仅用于向后兼容目的。但是,在未获得用户的动态位置许可的情况下,背景扫描被阻止。我不知道Android的更高版本(如7-9)是否继续支持这种向后兼容性。我建议您只需实现动态权限请求。看见
beaconManager.startMonitoringBeaconsInRegion(monitoringRegion);                beaconManager.startRangingBeaconsInRegion(monitoringRegion);
Log.e(TAG, "unable to start beacon monitoring.. ", e);