在服务上使用Android IBeacon库

时间:2014-10-13 22:38:32

标签: android ibeacon-android android-ibeacon

我正在使用Android IBeacon库进行项目。我需要创建一个服务,在后台启动信标范围,并在找到一个(最近的一个)时通知用户。我已经搜索了很多并根据我发现的许多例子进行了编码,但它仍然不起作用。使用日志我发现IBeaconManager没有绑定,因此永远不会调用onIBeaconServiceConnect。我已经尝试了一些我在这里找到的解决方案,但它们都没有用。如果有人能帮我解决这个问题,我真的很感激。我在这里发布了一些代码

public class RangingService extends Service implements IBeaconConsumer
{
private IBeaconManager beaconManager;

@Override public void onCreate() { super.onCreate(); beaconManager = IBeaconManager.getInstanceForApplication(this); Log.d("RangingService","Created beaconManager instance"); beaconManager.setBackgroundBetweenScanPeriod(120000); beaconManager.setBackgroundScanPeriod(30000); beaconManager.bind(this); if(beaconManager.isBound(this)) { Log.d("RangingService","Beacon manager bound"); } else { Log.d("RangingService","Beacon manager not bound"); } //Show the service has started notify("RangingService created", "RangingService has started"); } @Override public void onDestroy() { super.onDestroy(); beaconManager.unBind(this); } @Override public void onIBeaconServiceConnect() { Log.d("RangingService", "Entering onIBeaconServiceConnect"); beaconManager.setRangeNotifier(new RangeNotifier() { @Override public void didRangeBeaconsInRegion(Collection<IBeacon> beacons, Region region) { if(beacons.size() > 0) { IBeacon nearestBeacon = beacons.iterator().next(); for(IBeacon b : beacons) { if(nearestBeacon.getProximity() == IBeacon.PROXIMITY_UNKNOWN) { nearestBeacon = b; } else { if(b.getProximity() != IBeacon.PROXIMITY_UNKNOWN) { if(b.getAccuracy() < nearestBeacon.getAccuracy()) { nearestBeacon = b; } } } } Log.d("RangingService","Nearest Beacon Found "+nearestBeacon.getMajor()+";"+nearestBeacon.getMinor()); notify("Beacon read","Major: "+nearestBeacon.getMajor()+"; Minor: "+nearestBeacon.getMinor()); } else { Log.d("RangingService","No beacons"); } } }); try { Log.d("RangingService", "Entering startRangingBeacons"); beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null)); } catch(RemoteException e) { notificar("Error", e.getMessage()); Log.e("RangingService", "Error while starting scanning: "+e.getMessage()); } } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.d("RangingService", "Entering onBind"); return null; }

服务已经在我的清单中了。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

有几点:

  1. 代码表明您使用的是Android iBeacon库的0.x版本。如果您要开始一个新项目,我强烈建议您使用Android Beacon Library 2.0,因为早期的库不再被主动维护,现在很难找到它的文档。

  2. 无论您使用的库版本如何,绑定到onBeaconServiceConnect()后,您都应该能够回复BeaconManager方法。您没有收到此回调的事实可能表示BeaconService未正常启动。

  3. BeaconService未正确启动的最可能原因是因为它未在清单中正确声明。如果您使用的是Eclipse,则必须编辑project.properties文件并添加以下行:manifestmerger.enabled=true。如果您使用的是AndroidStudio,则无需这样做。如果您使用的是IntelliJ,则可能需要手动声明服务。

    您可以通过查看bin / AndroidManifest.xml中生成的清单文件并验证它是否有BeaconService的条目来验证清单是否具有正确的条目。

答案 1 :(得分:0)

我遇到过类似的问题。通过做以下事情得到解决

  1. 在eclipse project.properties中添加了manifestmerger.enabled = true

  2. 重启了日食

  3. 在我的Android手机中卸载了其他灯塔应用并重新启动了手机