1

Я написал следующую услугу. Идея состоит в том, чтобы отправить местоположение пользователя на сервер при запуске приложения и когда пользователь переместится более чем на 500m. Проблема в том, что при запуске он вызывает onLocationChanged 3 раза.onLocationChanged вызывается несколько раз при запуске приложения

Я не могу понять, откуда его зовут 3 раза. Пожалуйста, помогите мне решить эту проблему.

public class LocationUpdateService extends Service implements 
     LocationListener, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 



    private static final long BACKGROUND_INTERVAL = 60000; 

    final private String TAG = LocationUpdateService.class.getSimpleName(); 
    private LocationRequest mLocationRequest; 
    private GoogleApiClient mGoogleApiClient; 
    private String LOCATION_PREF = "LOCATION_PREF"; 



    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i(TAG, "onStartCommand: "); 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(BACKGROUND_INTERVAL); 
     mLocationRequest.setFastestInterval(30000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
     mLocationRequest.setSmallestDisplacement(500); 
     super.onStartCommand(intent, flags, startId); 
     return START_STICKY; 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     Log.i("Location Service", "onLocationChanged: " + location.toString()); 
     saveLocationandReport(String.valueOf(location.getLatitude()), String.valueOf(location.getLongitude())); 
    } 

ответ

2

Вы не контролируете, когда вызывается onLocationChanged - это служба определения местоположения, которая его вызывает.

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

Как правило, для точного местоположения требуется некоторое время, поэтому, если вам нужна точность, это может иметь смысл разрешить это в вашем приложении.

+0

Спасибо, так что мне нужно, чтобы вызвать его в последнее время? или Хит-сервер при третьей попытке, он всегда попадает в службу три раза – Kirmani88

+1

использует параметр точности, предоставляемый объектом местоположения, а затем на основании этого можно решить, что делать – Ak9637

+0

@ Ak9637: getAccuracy возвращает 23.33 на все образы – Kirmani88

3

Вы не можете управлять onLocationChanged, он управляется службой поиска. В вашем случае вы можете установить время ожидания буфера/ожидания, если у вас есть обновление местоположения в течение времени буфера, вы можете проверить его сравнение его точности с предыдущим обновлением местоположения, которое когда-либо лучше всего использовать.

private int FASTEST_INTERVAL = 1000; // use whatever suits you 
private Location currentLocation = null; 
private long locationUpdatedAt = Long.MIN_VALUE; 

@Override 
public void onLocationChanged(Location location) { 
    boolean updateLocationandReport = false; 
    if(currentLocation == null){ 
     currentLocation = location; 
     locationUpdatedAt = System.currentTimeMillis(); 
     updateLocationandReport = true; 
    } else { 
     long secondsElapsed = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - locationUpdatedAt); 
     if (secondsElapsed >= TimeUnit.MILLISECONDS.toSeconds(FASTEST_INTERVAL)){ 
      // check location accuracy here 
      currentLocation = location; 
      locationUpdatedAt = System.currentTimeMillis(); 
      updateLocationandReport = true; 
     }   
    } 
    if(updateLocationandReport){ 
     // send your location to server 
    } 
} 
Смежные вопросы