Android OnePlus6 не может обнаружить iBeacon с помощью библиотеки AltBeacon - PullRequest
1 голос
/ 10 апреля 2020

Я использую библиотеку AltBeacon для обнаружения iBeacons в моем приложении Android. Код у меня работает на следующих устройствах:

  • Xiaomi MI9 (Android 10.0)
  • Motorola Moto G4 (Android 6.0.1)
  • Huawei P Smart (Android 8.0)
  • Samsung Galaxy S8 (Android 9.0)

Однако тот же код не работает для OnePlus 6 (Android 10, OxygenOS 10.3.2). Он не обнаруживает маяки в моем приложении. Я попытался обнаружить маяки с помощью другого приложения ( Locate ), которое работает. Создатель библиотеки AltBeacon сказал мне, что Locate использует библиотеку AltBeacon, поэтому маяки можно обнаружить. Это означает, что мои настройки кода неверны. Можете ли вы помочь мне, выяснив, что не так с моей настройкой?

Я проверил (например) этот ответ, хотя это не решило мою проблему. Я включил отладку для 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: завершено с циклом сканирования

Он продолжает печатать эти строки снова и снова ...

1 Ответ

1 голос
/ 10 апреля 2020

Отображаемые сообщения журнала (для OnePlus, да?) Указывают, что сканирование BLE запущено. Вы видите какие-либо строки журнала, показывающие шестнадцатеричные байты обнаруженных пакетов? Если сканирование BLE действительно работает, вы должны. Возможно, вы захотите сравнить журналы, выводимые другими устройствами.

Уверены ли вы, что вашему приложению на OnePlus предоставлено правильное разрешение на определение местоположения? Вы можете проверить в Настройки -> Приложения -> Ваше приложение -> Разрешения. Также убедитесь, что Bluetooth включен и местоположение включено для глобальных настроек телефона (но если Locate работает на том же устройстве, это не должно быть проблемой.)

Не ясно, связано ли это, но использование из beaconManager.bind() одновременно с RegionBootstrap не требуется и может вызвать конфликты. Код, по-видимому, не использует интерфейс BeaconConsumer, который вызывается методом привязки. Я предлагаю вам удалить вызов bind, использование BeaconConsumer и удалить все методы обратного вызова этого интерфейса, просто чтобы быть уверенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...