gpt4 book ai didi

android - 在服务上使用 Android IBeacon 库

转载 作者:行者123 更新时间:2023-11-29 21:00:12 25 4
gpt4 key购买 nike

我正在为一个项目使用 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;
}

该服务也已经在我的 list 中。感谢您的帮助。

最佳答案

几点:

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

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

BeaconService 没有正常启动的最可能原因是它没有在 list 中正确声明。如果您使用的是 Eclipse,则必须编辑 project.properties 文件并添加行:manifestmerger.enabled=true。如果您使用的是 AndroidStudio,则没有必要。如果您使用的是 IntelliJ,则可能需要手动声明该服务。

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

关于android - 在服务上使用 Android IBeacon 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26350020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com