2016-05-25 9 views
0

В моем приложении, которое отслеживает пройденное расстояние, у меня есть две кнопки. Первое обновление местоположения первого запуска, второе останавливает их.onLocationChanged возвращает старое местоположение

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

я понял, что я не получил старое расположение, но вместо этого я получил место измеряется сеть не GPS, поэтому это было настолько неточным. Когда я двигался дальше от зданий, gps начал работать, и место было правильным. Поэтому, чтобы избавиться от сетевого измерения, я проверяю, есть ли location 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)); 
    } 
0

Добавьте булевскую переменную, которая сообщит вам, что вы нажали кнопку ПУСК - boolean startPress = false;.
Всякий раз, когда вы нажимаете кнопку СТАРТ, обновите эту переменную - startPress = true;
Теперь проверьте ее значение перед обновлением расстояния. Если кнопка нажата, вы проигнорируете первое обновление и измените переменную, чтобы приложение. будет считать следующие обновления:

if (!startPress) { 
    stats.updateDistance(location.distanceTo(previousLocation)); 
} else { 
    startPress = false; 
} 
Смежные вопросы