7
  • 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?
Darish
  • 11,032
  • 5
  • 50
  • 70
  • 5
    Start 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 Answers1

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
  • 1
    Please 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