...或者很可能,我做错了。我想要的是每走一米就能在家里走一圈。下面的代码给出了错误的结果,因为当我在手机上安装应用程序时,我甚至没有移动就得到了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;
}
}
}
}
答案 0 :(得分:0)
GPS信号不够精确,无法为1米半径提供精确位置。在使用GPS的实际情况下,可能会出现高达50-100米的偏差。这在很大程度上取决于您所处的环境。 GPS将由建筑物,水等反射。平均偏差为10-20米。如果你在建筑物内部使用GPS提供商而不是网络提供商,情况会更糟。
此外,由于这个原因,你永远不会连续两次获得相同的坐标。即使你不动!为避免这种情况,您可以临时保存位置并将其与新位置进行比较。如果它们之间的距离达到定义的边界,则使用新位置。
答案 1 :(得分:0)
将您的位置提供商更改为GPS。并且在请求新位置之前已经实例化了LocationListener(在onResume()中;在onCreate()之后将调用onResume()。这可能是您的应用在启动时显示Toast的原因..尝试在requestLocationUpdates()之后实例化LocationListener。