我使用了here提供的标准示例,但我修改了它以记录如果没有找到任何内容以确保它实际被调用。
@Override
public void onBeaconServiceConnect() {
beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() == 0) {
Log.i("ActivityMain", "no beacons found");
}
if (beacons.size() > 0) {
Log.i("ActivityMain", "The first beacon I see is about " + beacons.iterator().next().getDistance() + " meters away.");
}
}
});
try {
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
} catch (RemoteException e) {
e.printStackTrace();
}
}
我尝试在绑定之前添加几个额外的解析器,我尝试扫描而不添加它们:
beaconManager.getBeaconParsers().add(new BeaconParser(BeaconParser.ALTBEACON_LAYOUT));
beaconManager.getBeaconParsers().add(new BeaconParser(BeaconParser.EDDYSTONE_TLM_LAYOUT));
beaconManager.getBeaconParsers().add(new BeaconParser(BeaconParser.EDDYSTONE_UID_LAYOUT));
beaconManager.getBeaconParsers().add(new BeaconParser(BeaconParser.EDDYSTONE_URL_LAYOUT));
beaconManager.getBeaconParsers().add(new BeaconParser(BeaconParser.URI_BEACON_LAYOUT));
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));
beaconManager.bind(this);
我在清单中指定了以下权限:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
现在我的房间里有多个信标,包括Eddystone和iBeacon。调用startRangingBeaconsInRegion(...)
D/BluetoothLeScanner: could not find callback wrapper
在logcat中显示了很多,如果这是任何指标。事情似乎是回调,因为我肯定知道这段代码
if (beacons.size() == 0) {
Log.i("ActivityMain", "no beacons found");
}
每秒执行一次。我已经尝试了这个应用Beacon Scanner,它也使用了AltBeacon并且发现我的信标很好。我已经检查了它的来源,并且它不喜欢我自己没有做过的任何事情,尽管另一个应用程序正在使用kotlin并且我正在使用java。
我已尝试在Moto G3和Galaxy S7上执行此操作,并且对其中任何一个都没有运气。
这可能是什么原因?