Fuseed 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);

}

}


person Anninos Kyriakou    schedule 22.03.2016    source источник


Ответы (2)


Согласно этому SO вопрос, особенно ответ cgr.

Displacement, установленный для LocationRequest, не имеет шансов получить местоположения, если устройство неподвижно, поскольку Displacement имеет приоритет над Intevals (interval и fastInterval). Как я мог догадаться, возможно, вы передали другой объект LocationRequest (без набора смещения) в LocationServices.FusedLocationApi.requestLocationUpdates().

Запрос LocationRequest setSmallestDisplacement (наименьшее с плавающей запятой DisplacementMeters)

устанавливается минимальное смещение между обновлением местоположения в метрах. По умолчанию значение этого параметра равно 0. Он возвращает один и тот же объект, поэтому сеттеры могут быть объединены в цепочку.

ПРИМЕЧАНИЕ. Запросы местоположения от приложений с ACCESS_COARSE_LOCATION, а не ACCESS_FINE_LOCATION, будут автоматически регулироваться до более медленного интервала, а объект местоположения будет запутан, чтобы отображать только грубый уровень точности.

Посетите эту страницу. за дополнительной информацией.

person KENdi    schedule 23.03.2016
comment
Глубоко, что мне делать, если мне нужно учитывать оба параметра вместе? например каждые 10 секунд или 50 метров, в зависимости от того, что раньше. - person hushed_voice; 13.07.2019

Попробуйте что-то вроде этого:

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
}
person vinidog    schedule 15.10.2017
comment
Не уверен, как этот ответ получил одобрение. Вы ничего не решаете этим, особенно когда мы даже не знаем, какие у вас значения, которые вы устанавливаете в LocationRequest. - person Bamerza; 07.06.2019