当前位置: 首页 > 知识库问答 >
问题:

应用程序关闭时AltBeacon不检测beacon

隆睿
2023-03-14

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

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

谢谢阅读,希望你能帮上忙。

共有1个答案

卫嘉泽
2023-03-14

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

几个小贴士:

>

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

    有不同的方法来杀死一个应用程序,有些方法杀死它不会允许扫描进程重新启动自己。如果你从设置->应用程序->我的应用程序->强制停止中杀死应用程序,操作系统将不允许Android Beacon库重新启动自己。有一些报道称,从任务切换器中关闭应用程序会在一些设备上导致同样的行为,但这种构建的手机很少。在命令行上使用ADB logcatADB shell ps检查应用程序是否在关闭后五分钟运行。

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

  •  类似资料:
    • 我试图重新创建Connect四,我成功了。但我想通过频繁地切换颜色,给玩家一个获胜的四张光盘在哪里的指示。我对线程和编程中的时间概念是新的。 我也成功地给了用户这个指示,但是在关闭应用程序之后,控制台仍然会给出输出,也是在使用SetonCloserEquest时。 代码如下:

    • 问题内容: 在Swing中,您可以简单地用于在关闭窗口时关闭整个应用程序。 但是,在JavaFX中找不到等效项。我有多个打开的窗口,如果一个窗口关闭,我想关闭整个应用程序。用JavaFX做到这一点的方法是什么? 编辑: 我了解可以覆盖以在窗口关闭时执行一些操作。问题是应该执行什么操作才能终止整个应用程序? 类中定义的方法不执行任何操作。 问题答案: 当最后一个关闭时,应用程序自动停止。目前,您的类

    • 我做了一个jsf应用程序。这个应用程序有一个包含开始、停止按钮的菜单。当按下开始时,应用程序开始从网站获取数据,并更新其数据库。应用程序还有更新过程的进度条。但是,这个过程需要很长时间才能完成。我希望当我关闭浏览器时,它应该继续更新数据库。此外,当我再次打开它时,我应该得到以前的状态。然而,这并没有发生。当我关闭浏览器时,应用程序也关闭了。我该怎么办? 谢谢。

    • 我想检测传入/传出电话号码时,我的应用程序不运行,它被杀死。我已经实现了以下代码,它只检测呼叫,如果应用程序正在运行或在后台,但不工作时,应用程序被杀死。 舱单

    • 问题内容: 有时,通过按主屏幕按钮可以关闭应用程序,并且不会调用onDestroy()。我想在整个应用程序关闭时调用一个方法,而我不会在所有活动的onDestroy()中调用我的方法。 问题答案: 在appication类内实现LifecycleObserver然后用作打击: 也可以使用其他事件,例如Lifecycle.Event.ON_DESTROY或ON_CREATE

    • 我想用Xamarin格式的C#创建一个基于文本的Android游戏。 在故事中,我想设置角色任务,这需要一些时间,例如“我去挖这个洞,完成后给你打电话。” 如何将通知设置为在设置的时间之后显示?例如,上述声明可能需要10分钟,然后用户收到继续游戏的通知? 我一周前才开始做C#,所以如果这是noobish,或者已经被问到了,我道歉。我到处都找过,但有几种类型的通知,当我试图理解它时,似乎我在读法语。