0

我需要在後臺獲取用戶的位置,所以我試圖在我的Service類中使用Fused Location Provider。我將下面的代碼放在onStart()方法的內部,但上下文MainActivity.getAppContext()未被識別。我可以在自己的位置使用什麼,因爲我在我的Service類中使用它?如何在Service類中使用Fused Location Provider?

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

回答

0

一個ServiceService可以使用thisContext左右。

服務還有getApplicationContext()返回應用程序的上下文,它看起來像MainActivity.getAppContext()可能應該返回。你也可以使用它。

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

下面的代碼說明如何使用融合的位置提供服務

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

     } 
相關問題