图书馆继续正确扫描,但未在此模式下检测到信标。
我在许多地方读过,但他们对于这是否可能存在非常不同的看法。 (我想是的)
在IOS
中,使用原生sdk的相同实现可以毫无困难地实现,在android中似乎有点棘手。
前景和背景时效果很好。
这是我的beaconManager
配置:
public void setUpBeaconManager() throws RemoteException {
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(MainActivity.this);
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,d:25-25"));
beaconManager.setBackgroundBetweenScanPeriod(2000);
beaconManager.setForegroundBetweenScanPeriod(2000);
beaconManager.updateScanPeriods();
beaconManager.bind(MainActivity.this);
}
}
@Override
public void onBeaconServiceConnect() {
Log.e(Tags.MAIN_ACTIVITY, "Beacon "+beaconManager.checkAvailability() );
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
Beacon firstBeacon = beacons.iterator().next();
if (finishedRequest) {
Log.e("", "beacon id1: " + firstBeacon.getId1());
processDetectBeacons(firstBeacon.getId2().toInt(), firstBeacon.getId3().toInt());
}
Log.e(Tags.MAIN_ACTIVITY, "Beacon " + firstBeacon.toString() + " is about " + firstBeacon.getDistance() + " meters away.");
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {beaconManager.unbind(this);}
}
包容我尝试实施BootstrapNotifier
public class ApplicationManager extends Application implements BootstrapNotifier
public void onCreate() {
super.onCreate();
initRegionBootstrap();
}
private void initRegionBootstrap() {
Log.d("RegionBootstrap", "Init RegionBootstrap functionality!!!");
Region region = new Region("xxxx-4xx2-4E98-xxx-Bx5B7xxxx893E", Identifier.parse("xxxx-4xx2-4E98-xxx-Bx5B7xxxx893E"), null, null);
regionBootstrap = new RegionBootstrap(this, region);
}
@Override
public void didEnterRegion(Region region) {
Log.d("", "didEnterRegion: " + region);
}
@Override
public void didExitRegion(Region region) {
Log.d("", "didExitRegion");
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
Log.d("", "didDetermineStateForRegion");
}
感谢您的阅读,我希望您能提供帮助。
答案 0 :(得分:2)
根据显示的代码,每当系统检测到信标出现在范围内时,都应调用ApplicationManager
&#39; didEnterRegion(Region region)
。
一些提示:
首先关闭您的信标,并确认您在前台验证退出事件,之前启动背景,确保您的应用无法认为它已在该地区检测测试。从库版本2.8开始,即使在应用程序重新启动之后,您也无法获得第二个区域输入事件,直到退出事件发生。
认识到扫描在4.x的后台发生得更慢。 Android 4.x上的默认行为是扫描每5分钟发生一次。这意味着可能需要很长时间才能进行背景检测。根据{{1}}显示的代码,如果执行此操作,则会将扫描之间的背景周期增加到两秒。但是,如果应用程序被终止,此代码将无法在应用程序重新启动时执行(因为它是一个活动),扫描将再次每5分钟发生一次。确保你等待足够长的时间。
在后台使用5.x低功率扫描。低功耗扫描的实现是特定于设备的。在像Nexus 5和5x这样的新设备上,会发生持续扫描,并在3-6秒内将结果发送到应用程序。在三星Galaxy S5设备上,每15分钟进行一次定期扫描。因此,可能需要15分钟才能获得背景检测。确保你等待足够长的时间。
杀死某个应用后,该库会尝试在5分钟内重新启动扫描服务,但可能需要很长时间。确保你等待足够长的时间。
杀死某个应用程序的方法有很多种,杀死它的一些方法不允许扫描进程自行重启。如果你从设置 - &gt;中删除应用程序应用程序 - &gt;我的应用 - &gt;强制停止,操作系统将不允许Android Beacon Library重新启动。有一些报道称,从任务切换器中删除应用程序会在某些设备上导致同样的行为,但具有此类构建的手机很少见。在命令行上使用MainActivity
或adb logcat
检查应用程序是否在您杀死它后五分钟运行。
最好的方法可能是尝试对库使用Reference App,看看它在杀死应用后是否在后台检测到信标。这将消除任何可能的编码问题,只留下测试方法和特定于设备的问题作为可能的罪魁祸首。