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

AltBeacon not detect beacon when app is closed

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

I have read in many places, but they are very different opinions between whether this is possible or not. (I want to think it is)

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

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

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

几点提示:

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

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

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

  • 杀掉一个应用后,图书馆会尝试在5分钟内重启扫描服务,但可能需要那么长时间。请务必等待足够长的时间。

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

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