Android OnePlus6无法使用AltBeacon库检测iBeacon

问题描述 投票:0回答:1

我正在使用AltBeacon库在我的Android应用中检测iBeacons。我拥有的代码可在以下设备上使用:

  • 小米MI9(Android 10.0)
  • 摩托罗拉Moto G4(Android 6.0.1)
  • 华为P Smart(Android 8.0)
  • [三星Galaxy S8(Android 9.0)

但是,相同的代码不适用于OnePlus 6(Android 10,OxygenOS 10.3.2)。它在我的应用程序中未检测到任何信标。我试图使用另一个可以运行的应用程序(Locate)检测信标。 AltBeacon库的创建者告诉我,Locate使用AltBeacon库,因此可以检测到信标。这意味着我的代码设置错误。您能通过发现我的设置有什么问题来帮助我吗?

我检查(例如)this答案,尽管它不能解决我的问题。我打开了BeaconManager的调试功能,但没有得到任何有趣的结果(此问题底部的示例)。

ViewModel中,我称为MyStateManager。它包含一个列表regionsInRange,其中包含范围内的信标。我遗漏了一些代码,因为我认为这无关紧要。如果您觉得我遗漏了太多,我将其添加。

public class MyStateManager implements BootstrapNotifier {

  private static final MyStateManager instance = new MyStateManager();

  private final MyBeaconHelper myBeaconHelper;

  // ViewModel accessess this List to retrieve the beacons that are found.
  public final List<Region> regionsInRange = new ArrayList<>();

  private PresenceRegistrationStateManager() {
      presenceRegistrationBeaconHelper = new PresenceRegistrationBeaconHelper(this);
      updateScanningRegions();
  }

  @Override
  public Context getApplicationContext() {
      return MyApplication.getAppContext();
  }

  @Override
  public void didEnterRegion(Region region) {
      //Empty method
  }

  @Override
  public void didExitRegion(Region region) {
      //Empty method
  }

  @Override
  public void didDetermineStateForRegion(int status, Region region) {
      if (status == OUTSIDE) {
          regionsInRange.remove(region);
      } else {
          if (!regionsInRange.contains(region)) {
              regionsInRange.add(region);
          }
      }
      updateState();
  }

  public static MyStateManager getInstance() {
      return instance;
  }

  public void updateState() {
    // Own implementation here
  } 

  private void updateScanningRegions() {
    // add all the regions here
  }
}

此外,这是MyBeaconHelper

public class MyBeaconHelper implements BeaconConsumer, Serializable {

  private transient final RegionBootstrap regionBootstrap;

  private List<Region> scanRegions = new ArrayList<>();

  public MyBeaconHelper(BootstrapNotifier bootstrapNotifier) {
      BeaconManager beaconManager = BeaconManager.getInstanceForApplication(getApplicationContext());

      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"));
      LogManager.setVerboseLoggingEnabled(true);
      beaconManager.bind(this);

      regionBootstrap = new RegionBootstrap(bootstrapNotifier, new ArrayList<>());
  }

  @Override
  public void onBeaconServiceConnect() {
      //Empty method
  }

  @Override
  public Context getApplicationContext() {
      return MyApplication.getAppContext();
  }

  @Override
  public void unbindService(ServiceConnection serviceConnection) {
      getApplicationContext().unbindService(serviceConnection);
  }

  @Override
  public boolean bindService(Intent intent, ServiceConnection serviceConnection, int i) {
      return getApplicationContext().bindService(intent, serviceConnection, i);
  }

  public void updateScanRegions(List<Region> newRegions) {
      for (Region oldRegion : this.scanRegions) {
          if (!newRegions.contains(oldRegion)) {
              regionBootstrap.removeRegion(oldRegion);
          }
      }
      for (Region newRegion : newRegions) {
          if (!this.scanRegions.contains(newRegion)) {
              regionBootstrap.addRegion(newRegion);
          }
      }
      this.scanRegions = newRegions;
  }
}

当我打开BeaconManager的调试功能时,这向我展示了很多次:

2020-03-31 11:57:30.181 25259-25259 / com.my.app D / CycledLeScanner:开始新的扫描周期

2020-03-31 11:57:30.181 25259-25259 / com.my.app D / CycledLeScanner:我们已经在扫描,并且一直在1134毫秒]]

2020-03-31 11:57:30.181 25259-25259 / com.my.app D / CycledLeScanner:等待停止扫描周期另外1100毫秒

2020-03-31 11:57:30.181 25259-25259 / com.my.app D / CycledLeScanner:扫描开始

2020-03-31 11:57:31.213 25259-25259 / com.my.app D / CycledLeScanner:等待停止扫描周期再过69毫秒

2020-03-31 11:57:31.323 25259-25259 / com.my.app D / CycledLeScanner:完成扫描周期

它不断重复打印这些行...

我正在使用AltBeacon库在我的Android应用中检测iBeacons。我拥有的代码可在以下设备上使用:小米MI9(Android 10.0)摩托罗拉Moto G4(Android 6.0.1)华为P Smart(...

android ibeacon altbeacon ibeacon-android android-ibeacon
1个回答
0
投票

显示的日志消息(这些消息用于OnePlus,是吗?)表明已开始BLE扫描。您是否看到任何日志行显示检测到的数据包的十六进制字节?如果BLE扫描确实起作用,则应该这样做。您可能要比较其他设备输出的日志。

© www.soinside.com 2019 - 2024. All rights reserved.