felix
felix

Reputation: 454

How can I use Fused Location Provider inside a Service class?

I need to get the user's location in the background, so I am trying to use Fused Location Provider inside my Service class. I put the code below inside the onStart() method, but the context MainActivity.getAppContext() is not recognized. What can I use in its place, since I am using it in my Service class?

GoogleApi = new GoogleApiClient.Builder(MainActivity.getAppContext())
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .addApi(LocationServices.API)
        .build();

Upvotes: 2

Views: 4078

Answers (2)

Deepak Nishad
Deepak Nishad

Reputation: 31

Below code explains how to use fused location provider inside a service

        import android.Manifest;
        import android.app.Service;
        import android.content.Intent;
        import android.content.pm.PackageManager;
        import android.location.Location;
        import android.os.Bundle;
        import android.os.IBinder;
        import android.support.annotation.NonNull;
        import android.support.annotation.Nullable;
        import android.support.v4.app.ActivityCompat;
        import android.util.Log;

        import com.google.android.gms.common.ConnectionResult;
        import com.google.android.gms.common.api.GoogleApiClient;
        import com.google.android.gms.location.LocationListener;
        import com.google.android.gms.location.LocationRequest;
        import com.google.android.gms.location.LocationServices;

        public class LocationService extends Service implements
                LocationListener,
                GoogleApiClient.ConnectionCallbacks,
                GoogleApiClient.OnConnectionFailedListener {

            private String TAG = LocationService.class.getSimpleName();
            private GoogleApiClient mGoogleApiClient;
            private LocationRequest mLocationRequest;

            private static final long INTERVAL = 1000 * 30 * 60;
            private static final long FASTEST_INTERVAL = 1000 * 25 * 60;
            private static final long MEDIUM_INTERVAL = 1000 * 30 * 60;

            public LocationService() {
            }

            @Override
            public void onCreate() {
                super.onCreate();
                createLocationRequest();
                    mGoogleApiClient = new GoogleApiClient.Builder(this)
                            .addConnectionCallbacks(this)
                            .addOnConnectionFailedListener(this)
                            .addApi(LocationServices.API)
                            .build();
            }

            @Override
            public int onStartCommand(Intent intent, int flags, int startId) {

                if (!mGoogleApiClient.isConnected()) {
                    mGoogleApiClient.connect();
                } else {
                    startLocationUpdates();
                }
                return START_STICKY;
            }


            @Override
            public IBinder onBind(Intent intent) {
                // TODO: Return the communication channel to the service.
                throw new UnsupportedOperationException("Not yet implemented");
            }

            protected void createLocationRequest() {
                mLocationRequest = new LocationRequest();
                mLocationRequest.setInterval(MEDIUM_INTERVAL);
                mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
                mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            }

            @Override
            public void onConnected(@Nullable Bundle bundle) {
                Log.v(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
                if (mGoogleApiClient.isConnected()) {
                    startLocationUpdates();
                }
            }

            protected void startLocationUpdates() {
                if (mGoogleApiClient != null) {
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
                    Log.v(TAG, "Location update started ..............: ");
                }
            }

            protected void stopLocationUpdates() {
                if (mGoogleApiClient != null && mGoogleApiClient.isConnected() && LocationServices.FusedLocationApi != null) {
                    LocationServices.FusedLocationApi.removeLocationUpdates(
                            mGoogleApiClient, this);
                    Log.v(TAG, "Location update stopped .......................");
                    mGoogleApiClient.disconnect();
                }
            }


            @Override
            public void onConnectionSuspended(int i) {

            }

            @Override
            public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

            }

            @Override
            public void onLocationChanged(Location location) {
                Log.v(TAG, "Latitude: " + location.getLatitude() + " Longitude: " + location.getLongitude());
            }

            @Override
            public void onDestroy() {
                super.onDestroy();
                stopLocationUpdates();
                Log.v(TAG, "Service Stopped!");
            }

        }

Upvotes: 3

George Mulligan
George Mulligan

Reputation: 11903

A Service is a Context so from within the Service you can use this.

Service also has getApplicationContext() that returns the application's context which is what it looks like MainActivity.getAppContext() was likely supposed to be returning. You could use that too.

GoogleApi = new GoogleApiClient.Builder(getApplicationContext())
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .addApi(LocationServices.API)
        .build();

Upvotes: 0

Related Questions