在跟踪行驶距离的应用程序中,我有两个按钮。第一个开始的位置更新,第二个停止它们。
public void start(View view){
cords = new ArrayList<LatLng>();
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED){
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(
googleApiClient, locationRequest, this);
}
public void stop(View view) {
LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);
}
然后我声明onLocationChanged,我计算用户已经走过的距离。
@Override
public void onLocationChanged(Location location) {
cords.add(new LatLng(location.getLatitude(), location.getLongitude()));
if (cords.size() > 1) {
Location previousLocation = new Location("");
previousLocation.setLatitude(cords.get(cords.size() - 2).latitude);
previousLocation.setLongitude(cords.get(cords.size() - 2).longitude);
stats.updateDistance(location.distanceTo(previousLocation));
}
}
问题是,当我停止测量然后再次启动它们时,位置会返回旧值。我怎么能摆脱这个旧的价值并从全新的位置开始测量距离。
答案 0 :(得分:0)
我发现我没有得到旧位置,但我得到的位置是通过网络测量而不是gps,这就是为什么它如此不准确。当我远离建筑物时,gps开始工作,位置正确。因此,为了摆脱网络测量,我检查位置是否hasAltitude(),如果不是,则意味着它是由网络测量的,所以我可以忽略它。
@Override
public void onLocationChanged(Location location) {
if(location.hasAltitude()) {
cords.add(new LatLng(location.getLatitude(), location.getLongitude()));
if (cords.size() > 1) {
Location previousLocation = new Location("");
previousLocation.setLatitude(cords.get(cords.size() - 2).latitude);
previousLocation.setLongitude(cords.get(cords.size() - 2).longitude);
stats.updateDistance(location.distanceTo(previousLocation));
}