Как я могу использовать Fused Location Provider внутри класса службы?

Мне нужно получить местоположение пользователя в фоновом режиме, поэтому я пытаюсь использовать Fused Location Provider внутри своего класса службы. Я помещаю код ниже в метод onStart(), но контекст MainActivity.getAppContext() не распознается. Что я могу использовать вместо него, поскольку я использую его в своем классе обслуживания?

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

person felix    schedule 30.03.2016    source источник


Ответы (2)


Service — это Context, поэтому внутри Service вы можете использовать this.

У службы также есть getApplicationContext(), который возвращает контекст приложения, который, похоже, должен был возвращать MainActivity.getAppContext(). Вы могли бы использовать это тоже.

GoogleApi = new GoogleApiClient.Builder(getApplicationContext())
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .addApi(LocationServices.API)
        .build();
person George Mulligan    schedule 30.03.2016

В приведенном ниже коде объясняется, как использовать объединенный провайдер определения местоположения внутри службы.

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

        }
person Deepak Nishad    schedule 20.07.2017
comment
FusedLocationApi устарел. Предлагается для FusedLocationProviderClient. - person Abhi; 26.06.2018
comment
Класс FusedLocationApi устарел, но спасибо, что спасли меня. - person FlutterDevs; 14.11.2018