我的项目是指https://github.com/AltBeacon/android-beacon-library-reference。
通过文档和一些评论,我发现他们默认接收altBeacon信号。我想知道,我们如何个性化它以阅读其他不同的信标格式,如Eddystone和iBeacon。
由于它是开源的,我会坚持下去,然后相应地个性化(更新)。
例如,我们需要使用以下代码设置信标布局:
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
编辑:我按照答案中的建议更改了代码的setBeaconLayout部分。它还没有用。
我使用了以下代码(我指的是https://github.com/AltBeacon/android-beacon-library-reference)。我添加了那些setBeaconLayout
部分来接收eddystone信号,遗憾的是,我没有收到。但如果我删除它,我可以收到altBeacon信号。
public void onCreate() {
super.onCreate();
BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().clear();
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT)); //for Eddystone...
Log.d(TAG, "setting up background monitoring for beacons and power saving");
Region region = new Region("backgroundRegion",null, null, null);
regionBootstrap = new RegionBootstrap(this, region);
backgroundPowerSaver = new BackgroundPowerSaver(this);
}
任何人都可以帮助我吗?如何让我的应用程序接收eddystone信号?
P.s有人还可以为不同的信号提供样本setBeaconLayout
部分的列表。我假设如果我们只改变那部分,我们就可以接收信号(对于我们设置布局的信号格式。
非常感谢提前。
答案 0 :(得分:0)
最近我努力实现同样的目标,并得到了解决方案here。
您还需要通过将其置于Eddystone UUID模式来配置信标。
通过仅更改setBeaconLayout
,我们将无法检测到不同的信标格式.Eg - Eddystone UID格式与iBeacon UID格式不同。
您可以使用类似的东西探索不同的信标格式
mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
。
所以你的代码看起来应该是,
public class MyApplication extends Application implements BootstrapNotifier {
private static final String TAG = "MyApplication";
private RegionBootstrap regionBootstrap;
private BackgroundPowerSaver backgroundPowerSaver;
private BeaconManager mBeaconManager;
public void onCreate() {
super.onCreate();
mBeaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
mBeaconManager.getBeaconParsers().clear();
mBeaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
Region region = new Region("my-beacon-region", null, null, null);
regionBootstrap = new RegionBootstrap(this, region);
backgroundPowerSaver = new BackgroundPowerSaver(this);
}
@Override
public void didEnterRegion(Region region) {
Log.d("radbeacon", "Beacon detected in region");
}
@Override
public void didExitRegion(Region region) {
Log.d("radbeacon", "Beacon out of region");
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
//Ignore
}
}
另外,不要忘记将您的信标置于Eddystone
UID模式,然后打开信标,以便您的应用可以检测到它。
答案 1 :(得分:0)
代码对我来说很好看。确保您的信标实际上正在传输Eddystone-UID帧。您可以在Google Play商店试用Beacon Locate应用吗?它基于相同的库,并使用与问题中显示的类似的代码片段。我使用具有类似代码的应用程序来成功检测Eddystone-UID信标。
如果这不起作用,请通过调用mBeaconManager.setDebug(true)
打开应用中的低级调试,并粘贴LogCat的输出,如下所示:
D/BeaconParser﹕ This is not a matching Beacon advertisement. (Was expecting be ac. The bytes I see are: 0201061aff4c0002153d9d4c66fb0f11e3ab64c82a143314d68079186cb61c09426c756542617220426561636f6e20383833333134453537383038000000
这将告诉我们信标实际传输的字节数,因此我们可以看到它是否采用Eddystone-UID格式。
编辑:问题似乎是2015年11月15日之前与参考应用程序捆绑在一起的Android Beacon Library版本中的错误。有关详细信息,请参阅我的其他答案。 < / p>
答案 2 :(得分:0)
截至2015年11月15日,参考应用程序中使用的Android Beacon Library版本2.6中存在一个错误。该错误阻止使用默认区域规范检测Eddystone信标< / strong>有三个空标识符。
该错误已修复,如同2.6.1版的库一样。我在2015年11月16日将参考应用程序升级到使用版本2.7,其中包括该错误修复。
简单的解决方案是使用参考应用程序的最新副本,或修改您必须更改行的副本:
compile 'org.altbeacon:android-beacon-library:2.6@aar'
到
compile 'org.altbeacon:android-beacon-library:2.7@aar'