【发布时间】:2017-03-08 11:12:25
【问题描述】:
我创建了一个类GPSController。 onReceive 每分钟调用一次。
我想在我的AsyncTask 中使用GPSListener 获取当前的GPS 数据。
但是永远不会调用 onLocationChanged 方法。 :-/
这是我的班级:
public class GPSController extends SensorTimeController {
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0;
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 2;
private boolean isGPSEnabled = false;
private boolean isNetworkEnabled = false;
private double latitude = -1;
private double longitude = -1;
private double altitude = -1;
private double speed = 0L;
private double bearing = 0L;
private LocationManager locationManager;
private GPSLocationTask backgroundTask;
public GPSController(GPSModule module) {
super(module);
backgroundTask = new GPSLocationTask();
}
private void SensorDataFinished(double longitude, double latitude, double altitude, double speed, double bearing) {
Date date = new Date(System.currentTimeMillis());
SensorRecord record = new SensorRecord(module.getNextIndex(), date, structure);
if (longitude != -1)
record.addData("longitude", String.valueOf(longitude));
else
record.addData("longitude", " ");
if (latitude != -1)
record.addData("latitude", String.valueOf(longitude));
else
record.addData("latitude", " ");
if (altitude != -1)
record.addData("altitude", String.valueOf(altitude));
else
record.addData("altitude", " ");
if (bearing != 0L)
record.addData("bearing", String.valueOf(bearing));
else
record.addData("bearing", " ");
if (speed != 0L)
record.addData("speed", String.valueOf(speed));
else
record.addData("speed", " ");
module.log(record);
}
@Override
public void onReceive(Context context, Intent intent) {
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
backgroundTask.execute();
}
private class GPSLocationTask extends AsyncTask<Void, Void, Void> implements LocationListener {
@Override
protected Void doInBackground(Void... params) {
System.out.println("THREAD STARTED");
try {
Looper.prepare();
Looper.loop();
if(isNetworkEnabled)
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if(isGPSEnabled)
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
}catch(SecurityException e) {
e.printStackTrace();
}
return null;
}
public void onLocationChanged(Location location) {
if (location != null) {
longitude = location.getLongitude();
latitude = location.getLatitude();
altitude = location.getAltitude();
// don't do anything if we get a null reading for some reason
if (longitude == 0.0f && latitude == 0.0f)
return;
// any speed information?
if (location.hasSpeed())
speed = (double) location.getSpeed();
// any bearing information?
if (location.hasBearing())
bearing = (double) location.getBearing();
System.out.println(longitude+", "+ latitude+", "+ altitude+", "+ speed+", "+ bearing);
SensorDataFinished(longitude, latitude, altitude, speed, bearing);
}
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
}
【问题讨论】:
-
如果我没记错的话,你永远不会打电话给
Looper.loop() -
感谢您的回答!我在 Looper.prepare() 之后添加了 Looper.loop() 但没有任何改变:-/
-
这可能是一个愚蠢的问题,但你有没有在这一分钟内动过?如果 GPS 没有检测到位置的任何变化(达到某个阈值,应该在几十厘米的数量级),则即使最小距离为零,也可能不会触发事件。此外,您能否更新您的代码以包含您所做的修改?
-
是的,我已经尝试过移动手机。我的目标是每次 onReceive 被称为电话的 GPS 位置时都能看到。当其他一切正常时,也许我应该用 lastknownlocation 扩展它。并且在第一次呼叫时从无到某个位置没有位置变化吗? :-/
-
代码更新:-)
标签: android asynchronous gps location