2017-01-10 3 views
0

Я пытаюсь реализовать карты Google с пользовательским маркером местоположения в приложении Android.
Я использую FusedLocationApi для получения обновлений местоположения и столкнулся с проблемой, которая в onLocationChanged() я получаю очень разные местоположения каждый раз, даже когда устройство не движется, но остается в одной позиции. Таким образом, положение пользователя, а также радиус точности изменяется несколько раз в минуту (показывает правильное и неправильное положение). Я понимаю, что это произошло из-за получения местоположения из разных источников, но как правильно определить и игнорировать неправильные и неопределенные местоположения? Пытался реализовать функцию, чтобы игнорировать неправильные изменения местоположения, но она не работает должным образом.
На снимках она выглядит для пользователя в течение одной минуты (пользователь остается в одном положении): 1Обновления местоположения - игнорировать неопределенные изменения местоположения

2

3

В коде

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; 
} 

Однако если я использую сборки -в пользовательском уровне пользователя - он работает отлично.
Что мне не хватает?

ответ

0

Я не уверен, если это проблема, но в документации андроида она показывает и рекомендуем использовать

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

после подключения клиента Google.

Link to the documentation

Кроме этого, я не нашел каких-либо конкретных ошибок.

BTW

Какие разрешения вы запросили?

Вы должны использовать <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

для LocationRequest.PRIORITY_HIGH_ACCURACY

+0

Я прошу обновления на onConnected() GoogleAPI обратного вызова. И запрос разрешения на точное местоположение –

Смежные вопросы