2

我需要在后台获取用户的位置,所以我试图在我的 Service 类中使用 Fused Location Provider。我将下面的代码放在onStart()方法中,但MainActivity.getAppContext()无法识别上下文。我可以在它的位置使用什么,因为我在我的服务类中使用它?

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

2 回答 2

3

下面的代码解释了如何在服务中使用融合的位置提供者

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

        }
于 2017-07-20T07:03:32.473 回答
0

AService是你可以使用Context的内部的一个。Servicethis

服务还getApplicationContext()可以返回应用程序的上下文,这看起来MainActivity.getAppContext()可能应该返回。你也可以用那个。

GoogleApi = new GoogleApiClient.Builder(getApplicationContext())
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .addApi(LocationServices.API)
        .build();
于 2016-03-30T23:40:31.190 回答