2013-11-15 4 views
2

... или, скорее всего, я делаю это неправильно. Я хочу показать тост каждый метр, который я иду внутри дома. Код ниже дает мне неправильные результаты, так как в момент установки приложения на свой телефон я получаю тост, даже не двигаясь!Android: измеренное расстояние между местоположениями неверно

public class MainActivity extends Activity { 

private LocationListener mLocationListener; 
private String mLocationProvider; 
private LocationManager mLocationManager; 
private Location mCurrentLocation; 
private int mCounter = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    mLocationListener = new MyLocationListener(); 

    Criteria criterion = new Criteria(); 
    criterion.setAccuracy(Criteria.ACCURACY_FINE); 
    criterion.setCostAllowed(true); 
    criterion.setPowerRequirement(Criteria.POWER_HIGH); 

    mLocationProvider = mLocationManager.getBestProvider(criterion, true);  
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    mCurrentLocation = mLocationManager.getLastKnownLocation(mLocationProvider); 
    mLocationManager.requestLocationUpdates(mLocationProvider, 5000, 1, mLocationListener); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    mLocationManager.removeUpdates(mLocationListener); 
} 

private class MyLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location newlocation) { 
     float distance = mCurrentLocation.distanceTo(newlocation); 
     if (distance >= 1) { 
      mCounter++; 
      Toast.makeText(MainActivity.this, String.format("Message #%d: you walked one more meter", mCounter), Toast.LENGTH_SHORT).show(); 
      mCurrentLocation = newlocation; 
     } 
    }  
} 
} 
+0

В тот момент, когда я установил приложение, значение переменной было установлено равным 3.036. Это потому, что провайдер использует сеть, а не GPS? – user2765861

+0

Да, поставщик сети дает неустойчивые результаты. Ваше местоположение постоянно меняется. – Naddy

+0

Возможно, вы правы, хотя я получил неверные результаты с помощью gps за пределами – user2765861

ответ

0

Сигнал GPS не достаточно точен, чтобы обеспечить точное местоположение радиусом 1 м. В реальных ситуациях с помощью GPS могут наблюдаться отклонения от 50 до 100 м. Это сильно зависит от среды, в которой вы находитесь. GPS будет отражаться зданиями, водой и т. Д. Среднее отклонение составляет 10-20 м. Это будет еще хуже, если ваша внутренняя часть здания использует поставщик GPS вместо сетевого провайдера.

Кроме того, из-за этого вы никогда не получите одинаковые координаты дважды подряд. Даже если вы не двигаетесь! Чтобы избежать этого, вы можете временно сохранить местоположение и сравнить его с новым местоположением. Если расстояние между ними попадает в определенный пограничник, используйте новое местоположение.

0

Измените поставщика услуг на GPS. И вы создали экземпляр LocationListener, прежде чем запрашивать новое местоположение (в onResume(); onResume() будет вызываться после onCreate()). Это может быть причиной того, что ваше приложение показывает Toast при запуске. Попробуйте создать экземпляр LocationListener после запросаLocationUpdates() ..

Смежные вопросы