Android:测量位置之间的距离是错误的

时间:2013-11-15 11:59:21

标签: android location distance

...或者很可能,我做错了。我想要的是每走一米就能在家里走一圈。下面的代码给出了错误的结果,因为当我在手机上安装应用程序时,我甚至没有移动就得到了Toast!

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

2 个答案:

答案 0 :(得分:0)

GPS信号不够精确,无法为1米半径提供精确位置。在使用GPS的实际情况下,可能会出现高达50-100米的偏差。这在很大程度上取决于您所处的环境。 GPS将由建筑物,水等反射。平均偏差为10-20米。如果你在建筑物内部使用GPS提供商而不是网络提供商,情况会更糟。

此外,由于这个原因,你永远不会连续两次获得相同的坐标。即使你不动!为避免这种情况,您可以临时保存位置并将其与新位置进行比较。如果它们之间的距离达到定义的边界,则使用新位置。

答案 1 :(得分:0)

将您的位置提供商更改为GPS。并且在请求新位置之前已经实例化了LocationListener(在onResume()中;在onCreate()之后将调用onResume()。这可能是您的应用在启动时显示Toast的原因..尝试在requestLocationUpdates()之后实例化LocationListener。