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.
- ¿Existe una alternativa al Cliente de ubicación (API de Google Play)?
- GetTriggeringGeofences y getGeofenceTransition de LocationServices
- ¿Cuándo debo desconectarme de Google Play Services en mi aplicación de Android?
- DeadObjectException en GMS :: LocationClient (Android)
- OnLocationChanged no ha llamado a algunos dispositivos
Gracias por adelantado.
- No se puede resolver el símbolo 'LocationClient' en Android Studio
- Do Geofences permanece activo en android después de reiniciar el dispositivo
- Multiple LocationClients está interfiriendo?
- Comprobación del estado del GPS con Google Play Services
- LocationClient requestUpdates onLocationChanged nunca llamado
- LocalizaciónClient - Mock Locations
- Android Fused Location API - cómo utilizar PRIORITY_BALANCED_POWER_ACCURACY y PRIORITY_HIGH_ACCURACY en una aplicación?
- ¿Debería conectarse y desconectarse de Google Play Services en cada actividad?
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í
- Uso de Canvas Signature pad que he creado en el emulador está funcionando bien, pero en el dispositivo Android dos pad de firma está llegando
- ¿Cómo puedo deshacerme de "Skipped Frames. Aplicación puede estar haciendo demasiado trabajo en su tema principal "error