38
votes

My app is designed to track user's location periodically and send it to server, Recently I changed my code with Google play services Location API.

I created the locationclient and connected to the service in onStartCommand

public int onStartCommand(Intent intent, int flags, int startId) {
    setUpLocationClientIfNeeded();
    if(!mLocationClient.isConnected() || !mLocationClient.isConnecting())
    mLocationClient.connect();
    return START_STICKY;

}

and in onConnected method, I send a location request,

@Override
public void onConnected(Bundle arg0) {
    System.out.println("Connected ...");
    mLocationClient.requestLocationUpdates(REQUEST, this);

}

The REQUEST object is,

 private static final LocationRequest REQUEST = LocationRequest.create()
      .setInterval(5*60*1000)      // 5 minutes
      .setFastestInterval(3*60*1000) // 3 minutes
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

Now the issue is,

  1. the onLocationChanged method is not getting called at the given interval i.e 5 minutes or the fastest interval 3 minutes. From the log I could see, its getting called only twice or thrice after that its not getting called at all ( I checked after 1 hour).

What is the issue with my above code?. ( I couldnt see any log for 'disconnected' also)

  1. To solve this, I tried to use alarmmanager to call the task periodically. Now how to get a single location update through Locationclient from a broadcastreceiver. (locationclient.getLastlocation() only return last stored location but it is not requesting a new location)
1
I'm having a very similar problem. I've done a quick and dirty service which is run periodically with an AlarmManager and I call getLastLocation each time. The call apparently returns a location, but this location is never updated. I found that opening the Google Maps application (probably works with other location aware applications) suddenly makes the locations received by my service update ok. Any idea of what might be going on?Miguel Prada
getlastlocation always uses passive provider instead of GPS or network provider which means only when any other app(like Google maps) gets the recent location Our app will use the same passivelyThiyagaB
Do you only want to track the user location when your app is running or also when it's in the background ?ddewaele
To get a single fresh location update, you create a location request with the setNumUpdates to 1, as per: developer.android.com/reference/com/google/android/gms/location/… but if you for some reason do not get the "callbacks" at all thats probably not very useful.Erik Vest Zielke
Have you checked to see if your service is still alive and not destroyed?Kai

1 Answers

35
votes

Full source code for a background service available here:

https://gist.github.com/blackcj/20efe2ac885c7297a676

Try adding the super call to your onStartCommand.

/**
 * Keeps the service running even after the app is closed.
 * 
 */
public int onStartCommand (Intent intent, int flags, int startId)
{
    super.onStartCommand(intent, flags, startId);

    setUpLocationClientIfNeeded();
    if(!mLocationClient.isConnected() || !mLocationClient.isConnecting())
    {
        mLocationClient.connect();
    }

    return START_STICKY;
}