No se pueden recibir las actualizaciones de ubicación de LocationClient después de que la pantalla se apagó
Estoy tratando de escribir un sencillo servicio Android que se ejecuta en segundo plano y recibe actualizaciones de localización de LocationClient (Google Map API Android V2). El problema es que cuando la pantalla se apaga, mi servicio no recibe más actualizaciones de ubicación. Intenté comprobar si el servicio estaba activo, incluso con la pantalla apagada, y lo hace (tengo un TimerTask programar un registro). Cuando la pantalla está encendida puedo recibir actualizaciones de ubicación, pero cuando la pantalla se apaga, veo sólo los registros de TimerTask y no recibo ninguna actualización de ubicación. La pantalla de activación vuelve a activar las actualizaciones de ubicación. ¿Cómo se puede resolver esto?
Aquí está mi servicio simple:
- ¿Cómo detener / cancelar el administrador de alarmas en otra actividad?
- Mostrar ProgressDialog en una clase de servicio
- Servicio de Android - startService se llama varias veces y hace que el valor mixup ...
- El servicio se está matando mientras se mantiene el bloqueo de la estela y después de llamar a startForeground
- Continuar el servicio incluso si la aplicación se ha eliminado de la aplicación Reciente.
public class LocationService extends Service implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, LocationListener{ private static final String TAG = LocationService.class.getSimpleName(); private LocationClient mLocationClient; private Timer timer; private static final LocationRequest REQUEST = LocationRequest.create() .setInterval(5*1000) // 5 seconds .setFastestInterval(3*1000) // 3 seconds .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); @Override public void onCreate() { Log.d(TAG, "Creating.."); mLocationClient = new LocationClient(this, this, this); timer = new Timer(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "Starting.."); if(!mLocationClient.isConnected() || !mLocationClient.isConnecting()) { Log.d(TAG, "Connecting location client.."); mLocationClient.connect(); } timer.scheduleAtFixedRate(new TimerTask(){ @Override public void run() { Log.d(TAG, "TimerTask executing"); }}, 0, 3*1000); return START_STICKY; } @Override public void onConnectionFailed(ConnectionResult result) { Log.d(TAG, "Connection failed.."); stopSelf(); } @Override public void onConnected(Bundle bundle) { System.out.println("Connected ..."); mLocationClient.requestLocationUpdates(REQUEST, this); } @Override public void onDisconnected() { Log.d(TAG, "Disconnected.."); stopSelf(); } @Override public IBinder onBind(Intent arg0) { throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onLocationChanged(Location location) { Log.d(TAG, "Received location update"); } @Override public void onDestroy() { Log.d(TAG, "Destroying.."); timer.cancel(); mLocationClient.removeLocationUpdates(this); } }
- ¿Es posible ejecutar el servicio en la plataforma android de forma continua incluso después de bloquear el dispositivo?
- ¿Cómo puedo guardar datos del servicio de Android?
- ¿Cómo ejecuto un método de servicio periódicamente?
- Obtener contexto en un servicio
- NullPointerException en el constructor de Service
- El servicio USSD no funciona
- Ejecutar un servicio con privilegios de root o agregar permisos con root
- Escuchar permanentemente los cambios en el portapapeles
Utilizar WakeLock
In onStartCommand
wl = ((PowerManager)getSystemService(Context.POWER_SERVICE)).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, yourTAG); wl.acquire();
En la destrucción
if (wl != null && wl.isHeld()) { wl.release(); }
Actualizar:–
En primer lugar usted necesita definir LocationClient en su OnCreate () que llamará su onConnected () …
Defina tu ubicaciónCliente como este ..
locationClient = new LocationClient(this, this, this); locationClient.connect();
Ahora en su onConnected () .. Sólo la solicitud de actualización de ubicación como esta ..
@Override public void onConnectionFailed(ConnectionResult arg0) { // TODO Auto-generated method stub } @Override public void onConnected(Bundle arg0) { src = locationClient.getLastLocation(); System.out.println("======================location 1==" + src); LocationRequest lrequest = new LocationRequest(); lrequest.setInterval(0); lrequest.setSmallestDisplacement(0); lrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationClient.requestLocationUpdates(lrequest, new LocationListener() { @Override public void onLocationChanged(Location arg0) { System.out.println("======================location 1233==" + arg0); /*Toast.makeText(getApplicationContext(), "Location is 12" + arg0.getLatitude(), Toast.LENGTH_SHORT).show();*/ } }); } @Override public void onDisconnected() { // TODO Auto-generated method stub }
*************** ANTES DE ************
Si su principal preocupación es encontrar su actualización de la ubicación continuamente .. entonces U puede utilizar undermentioned.
Use esto :: (Esto actualizará periódicamente la ubicación del usuario basado en GPS)
For OnCreate():: ---------------------- @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.speed); initui(); lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); provider = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); if(!provider){ String text = "ENABLE GPS TO ACCESS SPEEDO METER!"; Toast.makeText(Speedometer.this, text, Toast.LENGTH_LONG).show(); Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } if (location != null) { /*lat = (int) (location.getLatitude() * 1E6); longi = (int)(location.getLongitude() * 1E6);*/ String text = "Got Coordinates"; Toast.makeText(Speedometer.this, text, Toast.LENGTH_SHORT).show(); } //lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 2, this); } Now use onLocationChanged() --------------------------- @Override public void onLocationChanged(Location loc) { // TODO Auto-generated method stub float distance = 0; //float prevDis = 0; try{ if(prevLoc==null) { prevLoc = loc; //Toast.makeText(MainActivity.this, "PrevLOC" + prevLoc, Toast.LENGTH_SHORT).show(); Log.i("Main Activity", "Prev LOC" + prevLoc); } else { try{ Runtime r = Runtime.getRuntime(); r.gc(); }catch(Exception e){ e.printStackTrace(); } // When prevLoc is not null Log.i("Main Activity", "Prev LOC in new LOC BLAH BLAH BLAH" + prevLoc); newLoc = loc; //Toast.makeText(MainActivity.this, "NewLoc" + newLoc, Toast.LENGTH_SHORT).show(); Log.i("Main Activity", "New LOC" + newLoc); distance = prevLoc.distanceTo(newLoc); Log.i("Main Activity", "New DISTANCE DISTANCE DISTANCE DISTANCE DISTANCE DISTANCE " + distance); distance = (float) (3.6*distance); speed = distance; prevLoc = newLoc; Log.i("Main Activity", "New Coordinates set to PrevLoc" + prevLoc); } }catch(Exception e){ e.printStackTrace(); } if(speed <= 160){ try { mView.calculateAngleOfDeviation(speed); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } }else { Toast.makeText(Speedometer.this, "CONTROL SPEED", Toast.LENGTH_SHORT).show(); } } You can also utilize same in your activity :: ----------------------------------------------- @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override protected void onPause() { // TODO Auto-generated method stub stopListening(); super.onPause(); } private void stopListening() { // TODO Auto-generated method stub try{ if(lm != null){ lm.removeUpdates(this); }else{ lm.removeUpdates(this); } }catch(Exception e){ e.printStackTrace(); } } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); startListening(); } private void startListening() { // TODO Auto-generated method stub try{ lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this); }catch(Exception e){ e.printStackTrace(); } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); lm.removeUpdates(Speedometer.this); //System.exit(0); finish(); } Finally there's always a lot of way to do single thing. Hope it helps... Cheers!
No estoy seguro de dónde está tu problema. He hecho un proyecto con su código y parece estar funcionando como desee aquí. Recibí actualizaciones incluso cuando la pantalla estaba apagada. En cualquier caso, aquí están los pasos que tomé, tal vez su problema no está en el servicio, sino en cómo iniciarlo, o en otro lugar:
- Creé un proyecto androide predeterminado con una sola actividad principal.
- Incluí su código en un archivo separado denominado "LocationService"
- He añadido la biblioteca de servicios de Google Play al proyecto.
-
He añadido los siguientes permisos al manifiesto:
<Uses-permission android: name = "android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android: name = "android.permission.ACCESS_COARSE_LOCATION" />
Y en la etiqueta de aplicación declaré el servicio:
<service android:name=".LocationService" android:process=":Location_Service_Test" />
Finalmente agregué lo siguiente al onCreate de la actividad principal:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Start the service Intent service = new Intent(this, LocationService.class); startService(service); }
Si esto no resuelve su problema: incluya el resto de su código.
- Actividad de referencia de retención de Singleton fugas de memoria?
- Cómo escribir una matriz en un archivo de texto en el almacenamiento interno?