Unable to get LocationClient location updates after turning off the screen

I am trying to write a simple Android service that runs in the background and receives location updates from LocationClient (Google Map API Android V2). The problem is that when the screen turns off, my service no longer receives location updates. I tried to check if the service is active, even when the screen is off, and it works (I have a TimerTask scheduling log). When the screen is on, I can receive location updates, but when the screen turns off, I only see TimerTask logs, and I do not receive any location updates. Waking up the screen again includes location updates. How can this be solved?

Here is my simple service:

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); } } 
+4
source share
3 answers

Update: -

First, you need to define a LocationClient in your OnCreate (), which will call your onConnected () ...

Define your locationClient as follows.

 locationClient = new LocationClient(this, this, this); locationClient.connect(); 

Now in your onConnected () .. Just request a location update like this.

 @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 } 

*************** BEFORE ************

If your main problem is constantly looking for your location update, then U can be used below.

Use this :: (This will periodically update the user's location based on 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 always a lot of way to do single thing. Hope it helps... Cheers! 
+1
source

Use wakelock

in onStartCommand

 wl = ((PowerManager)getSystemService(Context.POWER_SERVICE)).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, yourTAG); wl.acquire(); 

at onDestroy

 if (wl != null && wl.isHeld()) { wl.release(); } 
+1
source

I am not sure where your problem is. I made a project with your code and it seems to work as desired. I received updates even when the screen was turned off. In any case, here are the steps I took, maybe your problem is not maintenance, but how you run it or somewhere else:

  • I created a default android project with one basic action.
  • I have included your code in a separate file called "LocationService"
  • I added the Google Play services library to the project.
  • I added the following manifests:

    <use-permission android: name = "android.permission.ACCESS_FINE_LOCATION" / "> <use-permission android: name =" android.permission.ACCESS_COARSE_LOCATION "/">

and in the application tag I declared the service:

  <service android:name=".LocationService" android:process=":Location_Service_Test" /> 

Finally, I added the following to onCreate of the main action:

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

If this does not solve your problem: specify the remainder of your code.

0
source

Source: https://habr.com/ru/post/1491914/


All Articles