0

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

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

ответ

0

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

Служба также имеет 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!"); 
      } 

     } 
Смежные вопросы