Actualizaciones de ubicación continua en segundo plano

Estoy desarrollando una aplicación que enviará actualizaciones de la ubicación continuamente de un servicio de fondo. Traté de seguir el código.

public class LocationService extends Service implements LocationListener, GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener { LocationRequest mLocationRequest; LocationClient mLocationClient; @Override public void onCreate() { //creating log file in mobile appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Service created:", com.example.locationservice.Constants.LOG_FILE); mLocationRequest = LocationRequest.create(); mLocationRequest.setInterval(5*1000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // mLocationRequest.setFastestInterval(5*1000); mLocationClient = new LocationClient(getApplicationContext(), this,this); mLocationClient.connect(); } @Override public void onStart(Intent intent, int startId) { int start = Service.START_STICKY; appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Service Started:", com.example.locationservice.Constants.LOG_FILE); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { // TODO Auto-generated method stub appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Connection to client failed", com.example.locationservice.Constants.LOG_FILE); this.stopSelf(); } @Override public void onConnected(Bundle arg0) { // TODO Auto-generated method stub Log.i("info", "Location Client is Connected"); appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Location Client Connectd:", com.example.locationservice.Constants.LOG_FILE); //checking for locaton enabled or not if(Util.isLocationEnabled(getApplicationContext())){ //checking for internet available or not if(Util.isInternetOn(getApplicationContext())){ mLocationClient.requestLocationUpdates(mLocationRequest, this); }else{ Log.i("info", "Internet not available"); appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Internet not available", com.example.locationservice.Constants.LOG_FILE); this.stopSelf(); } }else{ Log.i("info", "Location Acess disabled"); appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Location Acess disabled", com.example.locationservice.Constants.LOG_FILE); this.stopSelf(); } Log.i("info", "Service Connect status :: " + isServicesConnected()); } @Override public void onDisconnected() { // TODO Auto-generated method stub appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Location Client DisConnectd:", com.example.locationservice.Constants.LOG_FILE); Log.i("info", "Location Client is DisConnected"); } @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub double latitude = location.getLatitude(); double longitude = location.getLongitude(); appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Location Changed:", com.example.locationservice.Constants.LOG_FILE); Log.i("info", "Latitude :: " + latitude); Log.i("info", "Longitude :: " + longitude); if(Util.isInternetOn(getApplicationContext())){ //sending location details sendLocation(location); }else{ this.stopSelf(); Log.i("info", "Internet not available"); appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Internet not available", com.example.locationservice.Constants.LOG_FILE); } } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onDestroy() { // TODO Auto-generated method stub Log.i("info", "Service is destroyed"); mLocationClient.removeLocationUpdates(this); appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Service Destroyed:", com.example.locationservice.Constants.LOG_FILE); super.onDestroy(); } private boolean isServicesConnected() { // Check that Google Play services is available int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(LocationService.this); // If Google Play services is available if (ConnectionResult.SUCCESS == resultCode) { return true; } else { return false; } } } 

Pero onLocationChanged está llamando sólo cuando opend la aplicación incorporada del mapa. De otro modo no está actualizando los detalles de la ubicación. Comencé este servicio de una actividad usando el servicio de alarma. alarmManager dispara por cada minuto. Puede cualquiera decirme porqué onLocationChanged no está llamando continuamente.

Gracias por adelantado.

Prueba esto:

 @Override public void onCreate() { //creating log file in mobile appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Service created:", com.example.locationservice.Constants.LOG_FILE); mLocationClient = new LocationClient(getApplicationContext(), this,this); } 

Reemplace su onStart con:

 @Override public int onStartCommand(Intent intent, int flags, int startId) { mLocationClient.connect(); } 

y:

 @Override public void onConnected(Bundle arg0) { mLocationRequest = LocationRequest.create(); mLocationRequest.setInterval(5*1000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationClient.requestLocationUpdates(mLocationRequest, this); } 

Invoque su servicio:

 startService(yourServiceIntent); 

También puedes consultar mi código aquí

  • LocationClient reconecta automáticamente en `onDisconnect`
  • Hacer que Android Geofences permanezca activo hasta que se haya eliminado / caducado o solo hasta que se inicie mi PendingIntent
  • API de ubicación de Google: solicita actualizaciones de ubicación con intención pendiente?
  • API de geocodificación de Android BroadcastReceiver no activado
  • Reconocimiento de actividad deja de recibir actualizaciones cuando el teléfono pasa al modo de espera (estado de apagado de la pantalla)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.