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