Fused Location Api setSmallestDisplacement игнорируется/не работает
Я пытаюсь создать сервис, который будет получать обновления местоположения каждые x секунд и после расстояния Y. Я получаю обновления после x сек, но никогда после расстояния Y. Я протестировал его несколько раз с разными значениями, и кажется, что setSmallestDisplacement не работает вообще. Были различные сообщения по этому вопросу, но без какого-либо решения. Я был бы признателен, если бы кто-нибудь помог мне или хотя бы указал другое направление.
Моя Служба
public class GPS_Service extends Service implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener {
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private int timethresh;
private int distancethresh;
protected Location mCurrentLocation;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mGoogleApiClient.connect();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mLocationRequest = new LocationRequest();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
//Set the desired interval for active location updates, in milliseconds.
mLocationRequest.setInterval(60* 1000);
//Explicitly set the fastest interval for location updates, in milliseconds.
mLocationRequest.setFastestInterval(30* 1000);
//Set the minimum displacement between location updates in meters
mLocationRequest.setSmallestDisplacement(1); // float
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onConnected(Bundle bundle) {
if (mCurrentLocation == null) {
mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
}
//Requests location updates from the FusedLocationApi.
startLocationUpdates();
}
@Override
public void onLocationChanged(Location location) {
mCurrentLocation = location;
//Toast.makeText(this, ""+mCurrentLocation.getLatitude()+","+mCurrentLocation.getLongitude(), Toast.LENGTH_SHORT).show();
System.out.println(""+mCurrentLocation.getLatitude()+","+mCurrentLocation.getLongitude());
}
@Override
public void onConnectionSuspended(int i) {
// The connection to Google Play services was lost for some reason. We call connect() to
// attempt to re-establish the connection.
mGoogleApiClient.connect();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Toast.makeText(getApplicationContext(),"Location services connection failed with code " + connectionResult.getErrorCode(), Toast.LENGTH_LONG).show();
}
protected void startLocationUpdates() {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
}
}
2 ответа:
В соответствии с этим поэтому вопрос особенно ответ cgr.
Смещение, заданное для LocationRequest, не имеет шансов получить местоположения, если устройство неподвижно, поскольку смещение занимает прецедент над Intevals (interval и fastestInterval). Как я мог догадаться-возможно, вы передали другой объект LocationRequest (без набора смещений) в LocationServices.FusedLocationApi.requestLocationUpdates ().
LocationRequest setSmallestDisplacement (поплавок smallestDisplacementMeters)
Устанавливается минимальное смещение между точками обновления в метрах. По умолчанию это значение равно 0. Он возвращает тот же объект, так что сеттеры могут быть прикованы.
Примечание: запросы о местоположении от приложений с ACCESS_COARSE_LOCATION и не функция будет автоматически регулируется в более медленный интервал, и объект местоположения будет затуманен только до покажите грубый уровень точность.
Проверьте эту страницу для получения дополнительной информации.
Попробуйте что-нибудь вроде этого:
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); mLocationRequest.setSmallestDisplacement(100); //100 meters }