Google 播放服务位置 API - 计算距离
Google Play services location API - Counting distance
我一直在学习 https://developer.android.com/training/location/index.html 教程。
这是我的 class 实施新 Google 的位置 API:
public class GPSTracker implements LocationListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private final Context context;
private TextView distanceTextView;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private Location mLastLocation;
private double totalMeters = 0;
public GPSTracker(Context context, TextView distanceTextView) {
this.context = context;
this.distanceTextView = distanceTextView;
buildGoogleApiClient();
}
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
}
@Override
public void onLocationChanged(Location location) {
double distance = mLastLocation.distanceTo(location);
mLastLocation = location;
totalMeters += distance;
distanceTextView.setText(totalMeters + "");
}
@Override
public void onConnected(Bundle bundle) {
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(1000); // Update location every second
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Toast.makeText(context, connectionResult.getErrorMessage(), Toast.LENGTH_SHORT).show();
}
}
一切似乎都完美无缺,但是当我的 phone 根本没有移动时,每次执行 onLocationChanged 方法时 totalDistance 仍然增加 0.2-0.3 米。
非常感谢任何防止这种情况的解决方案。
不要忘记 GPS 的定位不准确。通常会有几米的偏差,所以像这样的读数不正确是很自然的。虽然旧的 LocationManager 有 minDistance 设置,但不幸的是 LocationRequest 没有。
几种解决方法: 你可以查看速度,如果速度为零,那可能说明用户实际上没有移动。您还可以手动检查旧位置是否与新位置几乎相同(在您的情况下 0.3m 似乎是一个很好的阈值)并丢弃该读数。最后但同样重要的是,您可以设置一个 ActivityRecognitionApi activity 侦听器来确定用户实际上是在移动还是静止。
我一直在学习 https://developer.android.com/training/location/index.html 教程。
这是我的 class 实施新 Google 的位置 API:
public class GPSTracker implements LocationListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private final Context context;
private TextView distanceTextView;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private Location mLastLocation;
private double totalMeters = 0;
public GPSTracker(Context context, TextView distanceTextView) {
this.context = context;
this.distanceTextView = distanceTextView;
buildGoogleApiClient();
}
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
}
@Override
public void onLocationChanged(Location location) {
double distance = mLastLocation.distanceTo(location);
mLastLocation = location;
totalMeters += distance;
distanceTextView.setText(totalMeters + "");
}
@Override
public void onConnected(Bundle bundle) {
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(1000); // Update location every second
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Toast.makeText(context, connectionResult.getErrorMessage(), Toast.LENGTH_SHORT).show();
}
}
一切似乎都完美无缺,但是当我的 phone 根本没有移动时,每次执行 onLocationChanged 方法时 totalDistance 仍然增加 0.2-0.3 米。
非常感谢任何防止这种情况的解决方案。
不要忘记 GPS 的定位不准确。通常会有几米的偏差,所以像这样的读数不正确是很自然的。虽然旧的 LocationManager 有 minDistance 设置,但不幸的是 LocationRequest 没有。
几种解决方法: 你可以查看速度,如果速度为零,那可能说明用户实际上没有移动。您还可以手动检查旧位置是否与新位置几乎相同(在您的情况下 0.3m 似乎是一个很好的阈值)并丢弃该读数。最后但同样重要的是,您可以设置一个 ActivityRecognitionApi activity 侦听器来确定用户实际上是在移动还是静止。