我正在使用AltBeacon库在我的Android应用中检测iBeacons
。我拥有的代码可在以下设备上使用:
但是,相同的代码不适用于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(...
显示的日志消息(这些消息用于OnePlus,是吗?)表明已开始BLE扫描。您是否看到任何日志行显示检测到的数据包的十六进制字节?如果BLE扫描确实起作用,则应该这样做。您可能要比较其他设备输出的日志。