- How to retrieve current location by using the new FusedLocation API from an IntentService?
- How can i make sure that IntentService will receive all callbacks from FusedLocation API? ie, How can i obtain the location object synchronously?
Asked
Active
Viewed 3,051 times
7

Darish
- 11,032
- 5
- 50
- 70
-
5Start by replacing the `IntentService` with a regular service. `IntentService` does not handle calling APIs that are themselves asynchronous, like the fused location provider API. You will need a regular service, with your own background thread (where needed), where you can shut down the service only when you get your data (or some timeout it reached). "How can i obtain the location object synchronously?" -- there is no guarantee that you can, which is why you replace your `IntentService` with a regular service. – CommonsWare Apr 28 '15 at 11:32
-
@DroidHacker have you solved this problem? – rupesh Sep 21 '15 at 11:19
1 Answers
4
This may help you
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
import com.example.driverapplication.CommonUtilities;
import com.example.driverapplication.R;
import com.example.driverapplication.ServiceHandler;
import com.example.driverapplication.utilities.ConnectionDetector;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
public class LocationUpdate extends Service implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private static final String TAG = "DRIVER";
private LocationManager mLocationManager = null;
private static final int LOCATION_INTERVAL = 30000;
private static final float LOCATION_DISTANCE = 0;
private double currentLat, currentLng;
private SharedPreferences pref;
private String driverId;
private GoogleApiClient mGoogleApiClient;
// A request to connect to Location Services
private LocationRequest mLocationRequest;
private LocationListener locationListener;
private class LocationListener implements
com.google.android.gms.location.LocationListener {
public LocationListener() {
}
@Override
public void onLocationChanged(Location location) {
Log.e(TAG, "onLocationChanged: " + location);
currentLat = location.getLatitude();
currentLng = location.getLongitude();
}
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand");
super.onStartCommand(intent, flags, startId);
boolean stopService = false;
if (intent != null)
stopService = intent.getBooleanExtra("stopservice", false);
System.out.println("stopservice " + stopService);
locationListener = new LocationListener();
if (stopService)
stopLocationUpdates();
else {
if (!mGoogleApiClient.isConnected())
mGoogleApiClient.connect();
}
return START_STICKY;
}
@Override
public void onCreate() {
Log.e(TAG, "onCreate");
pref = getSharedPreferences("driver_app", MODE_PRIVATE);
driverId = pref.getString("driver_id", "");
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy");
super.onDestroy();
}
public void stopLocationUpdates() {
LocationServices.FusedLocationApi.removeLocationUpdates(
mGoogleApiClient, locationListener);
if (mGoogleApiClient.isConnected())
mGoogleApiClient.disconnect();
}
@Override
public void onConnectionFailed(ConnectionResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onConnected(Bundle arg0) {
// TODO Auto-generated method stub
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocationRequest.setInterval(35000);
mLocationRequest.setFastestInterval(30000);
startLocationUpates();
}
private void startLocationUpates() {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, locationListener);
}
@Override
public void onConnectionSuspended(int arg0) {
// TODO Auto-generated method stub
}
}

Anas Ahamed
- 186
- 10
-
1Please note that Service (as opposed to IntentService) works in the application's main thread. By not creating your own thread in this service you will block application UI thread which may lead to bad user experience. – sdf3qrxewqrxeqwxfew3123 Dec 21 '15 at 15:05