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