1

Mon flux de contrôle est dans un IntentService (déclenché par un GcmListenerService) et doit maintenant obtenir l'emplacement de l'utilisateur. CommerequestLocationUpdates démarré cinq fois à partir de IntentService

LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient) 

pourrait retourner null, je demander des mises à jour de localisation. Je suppose qu'avec chaque mise à jour, l'emplacement est plus précis que celui d'avant en raison de la mécanique GPS. Je suppose que cinq mesures/mises à jour devraient suffire pour un emplacement précis. Comment puis-je implémenter cette logique dans un IntentService? La classe implémente les interfaces d'écoute:

public class LocationIntentService extends IntentService 
implements GoogleApiClient.ConnectionCallbacks, 
GoogleApiClient.OnConnectionFailedListener, 
LocationListener 

De cette façon, je pouvais utiliser un compteur dans public void onLocationChanged(Location location) et appelez LocationServices.FusedLocationApi.removeLocationUpdates() après cinq mises à jour. Cependant, je ne suis pas sûr si je peux faire confiance à Android que le même IntentService vit longtemps et n'est pas supprimé par le garbage collector dès que onHandleIntent est fait.

C'est le code complet que je utilise jusqu'à présent sans la logique de recueillir cinq mises à jour:

public class LocationIntentService extends IntentService implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

    private GoogleApiClient mGoogleApiClient; 

    public LocationIntentService() { 
     super("LocationIntentService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     mGoogleApiClient = new GoogleApiClient.Builder(getBaseContext()) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
     System.out.println(result.toString()); 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     LocationRequest mLocationRequest = LocationRequest.create(); 
     mLocationRequest.setInterval(500); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int cause) { 
    } 

    private void displayLocation(Location location) { 
     System.out.println(location.toString()); 
     DbHandler dbHandler = new DbHandler(getBaseContext()); 
     double latitude = location.getLatitude(); 
     double longitude = location.getLongitude(); 
     double altitude = location.getAltitude(); 
     float speed = location.getSpeed(); 
     long time = location.getTime(); 
     float accuracy = location.getAccuracy(); 
     PersistedLocation persistedLocation = new PersistedLocation(time, latitude, longitude, altitude, accuracy, speed); 
     dbHandler.insertLocation(persistedLocation); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     displayLocation(location); 
    } 
} 

Répondre

0

J'ai réussi à y arriver avec setNumUpdates(int i) et setExpirationDuration(long l).

@Override 
public void onConnected(Bundle connectionHint) { 
    LocationRequest mLocationRequest = LocationRequest.create(); 
    mLocationRequest.setInterval(500); 
    mLocationRequest.setNumUpdates(5); 
    mLocationRequest.setExpirationDuration(10000); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 
}