应用程序关闭时 AltBeacon 未检测到信标

Posted

技术标签:

【中文标题】应用程序关闭时 AltBeacon 未检测到信标【英文标题】:AltBeacon not detect beacon when app is closed 【发布时间】:2016-06-27 22:36:08 【问题描述】:

库继续正确扫描,但在此模式下未检测到信标。

我在很多地方都读过,但是对于这是否可能,他们的看法却大相径庭。 (我想是的)

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");

感谢阅读,希望对你有所帮助。

【问题讨论】:

您肯定需要使用 BootstrapNotifier。可以展示ApplicationManager的onCreate()方法吗? @davidgyoung 添加了onCreate() 方法 【参考方案1】:

根据显示的代码,每次系统检测到信标出现在范围内时,都应调用ApplicationManagerdidEnterRegion(Region region)

一些提示:

首先关闭信标并验证您在前台时收到退出事件,开始后台检测测试之前,确保您的应用不认为它已经在该区域中.从库版本 2.8 开始,即使在应用重新启动后,您也不会收到第二个区域进入事件,直到发生退出事件。

认识到在 4.x 的后台扫描发生得更慢。 Android 4.x 上的默认行为是每 5 分钟进行一次扫描。这意味着背景检测可能需要很长时间。根据为MainActivity 显示的代码,如果执行此代码,则会将扫描之间的背景时间增加到两秒。但是,如果应用程序被终止,此代码将不会在应用程序重新启动时执行(因为它是一个 Activity)并且扫描将再次每 5 分钟发生一次。确保等待足够长的时间。

在后台使用 5.x 低功耗扫描。低功耗扫描的实现是特定于设备的。在 Nexus 5 和 5x 等较新的设备上,将进行持续扫描并在 3-6 秒内将结果发送到应用程序。在三星 Galaxy S5 设备上,每 15 分钟进行一次定期扫描。因此,可能需要长达 15 分钟才能进行背景检测。确保等待足够长的时间。

杀死一个应用程序后,库会在 5 分钟内尝试重新启动扫描服务,但可能需要很长时间。确保等待足够长的时间。

有多种方法可以终止应用程序,并且某些终止应用程序的方法不允许扫描进程自行重新启动。如果您从设置 -> 应用程序 -> 我的应用程序 -> 强制停止中终止应用程序,操作系统将不允许 Android 信标库自行重启。有一些报道称,从任务切换器中终止应用程序会在某些设备上导致相同的行为,但具有此类构建的手机很少见。在命令行上使用adb logcatadb shell ps 来检查应用是否在您杀死它五分钟后运行。

最好的方法可能是尝试使用库的Reference App,看看它是否在杀死应用程序后检测到后台信标。这将消除任何可能的编码问题,只留下测试方法和特定于设备的问题作为可能的罪魁祸首。

【讨论】:

任何关于它对你有用的内容可能对其他人有帮助。 对于“最多 15 分钟”的问题是否有任何解决方法?对于我们的用例来说,这个时间太长了。 是的。作为备份,Android 信标库即使在后台也会定期执行完整的高功率、低延迟扫描。默认情况下,这是每 5 分钟 10 秒,因此您应该至少每 5 分钟看到一次检测,而不是每 15 分钟,即使在三星设备上也是如此。如果这还不够快,您可以使用beaconManager.setBackgroundBetweenScanPeriod(xxx)beaconManager.setBackgroundScanPeriod(xxx) 配置此后台扫描间隔,但请小心执行此操作,因为您花费的扫描时间越多,您的应用使用的电池就越多。

以上是关于应用程序关闭时 AltBeacon 未检测到信标的主要内容,如果未能解决你的问题,请参考以下文章

使用 altBeacon 库在 Android 中未显示所有信标

AltBeacon:didExitRegion 和 didEnterRegion 交替

AltBeacon api 在测距信标时返回空集合

AltBeacon getDistance() 函数与信标定位距离估计

在 Android 8 之前的应用程序重新启动后,AltBeacon 未检测到 iBeacon

altbeacon 参考应用程序和多个退出/进入调用