我创建了一个应用程序,它可以在三个以上信标范围不等的情况下对信标进行范围并计算位置。
问题是,当我想显示位置时,启动新的Intent是必要的,因此主要活动仍然不在Foreground中。大约5秒后,信标的范围停止,我的位置计算也因为信标的距离不再发生变化。
是否有可能继续测距信标?我已尝试在我的主要活动中启动异步任务,但它不起作用,可能有错误,我不知道。
这是我的异步任务代码和OnBeaconServiceConnect():
public class Monitor_Screen extends Activity implements BeaconConsumer,
SensorEventListener {
private class asyncThread extends AsyncTask<Activity, Void, BeaconManager> {
@Override
protected BeaconManager doInBackground(Activity... arg0) {
// TODO Auto-generated method stub
Thread.currentThread().setName("BeaconManagerThread");
Application myApplication = new Application();
// BeaconManager
myBeaconManager = BeaconManager.getInstanceForApplication(myApplication);
myBeaconManager
.getBeaconParsers()
.add(new BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
myBeaconManager.setBackgroundScanPeriod(TimeUnit.SECONDS.toMillis(1));
myBeaconManager.bind(Monitor_Screen.this);
// Region
myRegion = new Region("all beacons", null, null, null);
startService(Monitor_Screen.this.getIntent());
return myBeaconManager;
}
}
@Override
public void onBeaconServiceConnect() {
// // range beacons on connect
try {
myBeaconManager.startRangingBeaconsInRegion(myRegion);
} catch (RemoteException e) {
Toast.makeText(getApplicationContext(), e.getMessage(),
Toast.LENGTH_LONG).show();
}
myBeaconManager.setRangeNotifier(new RangeNotifier() {
public void didRangeBeaconsInRegion(Collection<Beacon> beacons,
Region myRegion) {
if (beacons.size() > 0) {
Iterator<Beacon> myIterator = beacons.iterator();
while (myIterator.hasNext()) {
Beacon tempBeacon = myIterator.next();
MyBeacon myBeacon = new MyBeacon(tempBeacon.getId1(),
tempBeacon.getId2(), tempBeacon.getId3(),
tempBeacon.getBluetoothAddress(), tempBeacon
.getRssi(), tempBeacon.getDistance(),
tempBeacon.getTxPower(), System
.currentTimeMillis(),
new Position(0, 0));
boolean isIn = false;
for (MyBeacon blub : myVector) {
if (blub.getBTAdress().equals(
myBeacon.getBTAdress())) {
isIn = true;
blub.distance = myBeacon.getDistance();
}
}
if (!isIn)
myVector.add(myBeacon);
}
}
logBeaconData();
for (int i = 0; i < myVector.size(); i++) {
if (System.currentTimeMillis()
- myVector.get(i).getTimeStamp() > 10000) {
myVector.remove(i);
}
}
}
});
try {
myBeaconManager.startMonitoringBeaconsInRegion(myRegion);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
myBeaconManager.setMonitorNotifier(new MonitorNotifier() {
@Override
public void didExitRegion(Region arg0) {
// TODO Auto-generated method stub
}
@Override
public void didEnterRegion(Region arg0) {
// TODO Auto-generated method stub
}
@Override
public void didDetermineStateForRegion(int arg0, Region arg1) {
// TODO Auto-generated method stub
}
});
}
答案 0 :(得分:0)
在后台继续进行信标测距的最简单方法是在自定义android.app.Application
类中设置信标范围,并将回调转发到Activity
以仅更新显示Activity
位于前台。
您可以在Android Beacon Library的https://github.com/AltBeacon/android-beacon-library-reference参考申请中看到这样做的示例:{{3}}
以下是自定义android.app.Application
类的摘录,其中设置了此类。请注意,范围设置一次,并将在应用程序的整个生命周期中继续。范围回调如果存在则传递给mRangingActivity
,因此它可以进行任何必要的UI处理。
public class BeaconReferenceApplication extends Application implements BootstrapNotifier, RangeNotifier {
...
public void onCreate() {
mAllBeaconsRegion = new Region("all beacons", null, null, null);
mBeaconManager = BeaconManager.getInstanceForApplication(this);
mBackgroundPowerSaver = new BackgroundPowerSaver(this);
mRegionBootstrap = new RegionBootstrap(this, mAllBeaconsRegion);
}
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> arg0, Region arg1) {
if (mRangingActivity != null) {
mRangingActivity.didRangeBeaconsInRegion(arg0, arg1);
}
}
@Override
public void didEnterRegion(Region arg0) {
try {
Log.d(TAG, "entered region. starting ranging");
mBeaconManager.startRangingBeaconsInRegion(mAllBeaconsRegion);
mBeaconManager.setRangeNotifier(this);
} catch (RemoteException e) {
Log.e(TAG, "Cannot start ranging");
}
}
...
}