如何在Service类中使用Fused Location Provider?

时间:2016-03-30 23:37:42

标签: java android service fusedlocationproviderapi android-fusedlocation

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

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

2 个答案:

答案 0 :(得分: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!");
            }

        }

答案 1 :(得分:0)

df2 = self.df.copy()Service,因此您可以ContextService内使用this

服务还有getApplicationContext(),它返回应用程序的上下文,这可能是MainActivity.getAppContext()可能应该返回的内容。你也可以使用它。

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