2017-10-03 6 views
1

J'avais l'habitude d'utiliser FusedLocationApi jusqu'à ce que j'ai appris qu'il est déprécié (voir les références ci-dessous). C'était simple à mettre en œuvre. Comme la documentation dit que vous devez l'utiliser en conjonction avec GoogleApiClientFusedLocationProviderClient quand et comment arrêter Looper?

LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, 
         locationRequest, this); 

J'ai récemment changé à FusedLocationProviderClient (voir référence ci-dessous) A la suite d'un tutoriel, j'ai pu obtenir avec succès FusedLocationProviderClient travailler

Tutoriel: https://github.com/codepath/android_guides/wiki/Retrieving-Location-with-LocationServices-API

// new Google API SDK v11 uses getFusedLocationProviderClient(this) 
getFusedLocationProviderClient(this).requestLocationUpdates(mLocationRequest, new LocationCallback() { 
     @Override 
     public void onLocationResult(LocationResult locationResult) { 
     // do work here 
     onLocationChanged(locationResult.getLastLocation(); 
     } 
    }, 
    Looper.myLooper()); 

Le problème que je rencontre est le thread Looper. Même avec l'application en arrière-plan, le thread Looper continue de s'exécuter. Je souhaite suspendre les mises à jour de position lorsque l'application est en arrière-plan, puis reprendre les mises à jour de position lorsque l'application est au premier plan. Comment puis-je atteindre cet objectif?

Références:

  1. https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi
  2. https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient

Répondre

5

Vous avez juste besoin d'appeler mFusedLocationClient.removeLocationUpdates(mLocationCallback) dans onPause() de votre activité. Cependant, il y a un peu plus que cela.

Utiliser les variables membres pour le FusedLocationProviderClient, GoogleApiClient et LocationRequest dans votre activité principale:

import com.google.android.gms.location.FusedLocationProviderClient; 
import com.google.android.gms.location.LocationCallback; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationResult; 

public class MainActivity extends AppCompatActivity 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    FusedLocationProviderClient mFusedLocationClient; 
    GoogleApiClient mGoogleApiClient; 
    LocationRequest mLocationRequest; 

    //.......... 

Utilisez une variable membre pour la LocationCallback ainsi:

LocationCallback mLocationCallback = new LocationCallback(){ 
    @Override 
    public void onLocationResult(LocationResult locationResult) { 
     for (Location location : locationResult.getLocations()) { 
      Log.i("MainActivity", "Location: " + location.getLatitude() + " " + location.getLongitude()); 

     } 
    }; 

}; 

Ensuite, assignez mFusedLocationClient à onCreate() :

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); 

    //............... 
} 

Ensuite, dans onResume(), si GoogleApiClient et FusedLocationProviderClient sont configurés, utilisez-les. Dans le cas contraire, il est la première fois l'activité a été lancée, donc connecter le GoogleApiClient:

@Override 
public void onResume() { 
    if (mGoogleApiClient != null && mFusedLocationClient != null) { 
     requestLocationUpdates(); 
    } else { 
     buildGoogleApiClient(); 
    } 
} 

protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    mGoogleApiClient.connect(); 
} 

@Override 
public void onConnected(Bundle bundle) { 
    requestLocationUpdates() 
} 

public void requestLocationUpdates() { 
    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(120000); // two minute interval 
    mLocationRequest.setFastestInterval(120000); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 
     mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper()); 
    } 
} 

Et enfin, en onPause(), appelez removeLocationUpdates():

@Override 
public void onPause() { 
    super.onPause(); 
    if (mFusedLocationClient != null) { 
     mFusedLocationClient.removeLocationUpdates(mLocationCallback); 
    } 
} 
+0

Ceci est clair maintenant, merci! – portfoliobuilder