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