我的代码现在已经到达检查点1和2了。但是,它只检测一次信标。我希望它每五秒钟收到一次信标(距离)的位置。我怎样才能实现这个?再次感谢iBeacon测距服务不返回任何信标(第2部分)
public class RangingService extends Service implements BeaconConsumer {
private BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
Handler handler;
String b = "";
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onStart(Intent intent, int startId) {
// Let it continue running until it is stopped.
Log.d("Service", "Started");
beaconManager.bind(this);
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,d:25-25"));
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Log.d("Checkpoint", "5 seconds have passed");
}
};
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
while(true)
{
try {
startJob();
Log.d("Checkpoint", "Job has started");
Thread.sleep(5285);
handler.sendEmptyMessage(0);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
//return START_STICKY;
}
public void startJob() {
Log.d("Checkpoint", "Starting job for realzies");
//onBeaconServiceConnect();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("Service", "Ended");
beaconManager.unbind(this);
}
@Override
public void onBeaconServiceConnect() {
Log.d("Checkpoint3", "Checkpoint3");
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
Log.d("Checkpoint1", "Checkpoint1");
if (beacons.size() > 0) {
Log.d("Checkpoint2", "Checkpoint2");
//EditText editText = (EditText)RangingActivity.this.findViewById(R.id.rangingText);
Beacon firstBeacon = beacons.iterator().next();
String a = "The first beacon " + firstBeacon.toString() + " is about " + firstBeacon.getDistance() + " meters away. RSSI = " + firstBeacon.getRssi();
Log.d("Service", a);
//logToDisplay(a);
}
}
});
try {
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
Log.d("Checkpoint4", "Checkpoint4");
} catch (RemoteException e) { }
}
}
这并不明显,为什么它只扫描检测信标一次。您可以尝试添加调试行来记录所有空的catch块中的任何异常。您也可以尝试在BeaconManager解除绑定之前停止测距(尽管这不应该是绝对必要的)。还值得注意的是,这可能不是最简单的方法 - 图书馆已经开始自己的服务并且可以配置为发送测距结果约。每5秒只需设置beaconManager.setForegroundBetweenScanPeriod(4000l); beaconManager.setForegroundScanPeriod(1100l);' – davidgyoung
感谢您的快速响应。我将如何使用setForegroundBetweenScanPeriod函数?我是否会从主要活动中调用它,然后摆脱我创建的服务? (对不起,如果这些是基本问题 - 我是一个业余程序员)再次感谢:) –
在@ Chris_Wilson的回答下看到我的评论。他走在正确的轨道上。 – davidgyoung