Я пытаюсь реализовать карты Google с пользовательским маркером местоположения в приложении Android.
Я использую FusedLocationApi
для получения обновлений местоположения и столкнулся с проблемой, которая в onLocationChanged() я получаю очень разные местоположения каждый раз, даже когда устройство не движется, но остается в одной позиции. Таким образом, положение пользователя, а также радиус точности изменяется несколько раз в минуту (показывает правильное и неправильное положение). Я понимаю, что это произошло из-за получения местоположения из разных источников, но как правильно определить и игнорировать неправильные и неопределенные местоположения? Пытался реализовать функцию, чтобы игнорировать неправильные изменения местоположения, но она не работает должным образом.
На снимках она выглядит для пользователя в течение одной минуты (пользователь остается в одном положении): Обновления местоположения - игнорировать неопределенные изменения местоположения
В коде
private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 10000;
private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS =
UPDATE_INTERVAL_IN_MILLISECONDS/2;
// build GoogleApiClient
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
createLocationRequest();
}
// create location request
protected void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
// ... here is how I request the updates
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest,this);
/**
* Callback that fires when the location changes.
*/
@Override
public void onLocationChanged(Location location) {
// TODO herre I try to figure out which location is right and which is wrong
if (shouldIgnoreLocationChange(mLastDrawnLocation, location)) {
return;
}
// here i should proceed only with eight location...
}
/**
* Checks whether location change (coordinates) should be ignored or not
*
* @param oldLocation previous {@link Location}
* @param newLocation new {@link Location}
* @return true if coordinates change should be ignored because it is not significant
*/
private boolean shouldIgnoreLocationChange(Location oldLocation, Location newLocation) {
if (oldLocation == null) {
// didn't have any location before, so accept new
return false;
} else if (null == newLocation || !newLocation.hasAccuracy() || newLocation.getAccuracy() > 150) {
// new location got invalid or too vague accuracy so ignore it
return true;
}
// ignore change if change is smaller then 3 meters and
if (oldLocation.distanceTo(newLocation) < 3f && newLocation.getAccuracy() >= oldLocation.getAccuracy()) {
return true;
}
return false;
}
Однако если я использую сборки -в пользовательском уровне пользователя - он работает отлично.
Что мне не хватает?
Я прошу обновления на onConnected() GoogleAPI обратного вызова. И запрос разрешения на точное местоположение –