onLocationChanged返回旧位置

时间:2016-05-25 21:57:56

标签: android gps location

在跟踪行驶距离的应用程序中,我有两个按钮。第一个开始的位置更新,第二个停止它们。

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));
    }
}

问题是,当我停止测量然后再次启动它们时,位置会返回旧值。我怎么能摆脱这个旧的价值并从全新的位置开始测量距离。

1 个答案:

答案 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));
    }