web-dev-qa-db-fra.com

FusedLocationProviderClient quand et comment arrêter Looper?

J'ai utilisé FusedLocationApi jusqu'à ce que j'apprenne qu'il est obsolète (voir les références ci-dessous). C'était simple à mettre en œuvre. Comme l'indique la documentation, vous devez l'utiliser en conjonction avec GoogleApiClient

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

J'ai récemment changé pour FusedLocationProviderClient (voir référence ci-dessous) Suite à un tutoriel, j'ai réussi à faire fonctionner FusedLocationProviderClient

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 l'emplacement lorsque l'application est en arrière-plan, puis reprendre les mises à jour de l'emplacement 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
10
portfoliobuilder

Après avoir obtenu l'emplacement, supprimez simplement mFusedLocationClient.removeLocationUpdates comme il l'a mentionné dans les réponses ci-dessus.

if (mFusedLocationClient != null) 
        mFusedLocationClient.removeLocationUpdates(mLocationCallback);

Le boucleur sera appelé requestLocationUpdates jusqu'à ce que vous le supprimiez.

Dans mon problème, j'ai fait comme je l'ai mentionné ci-dessus. Voici mon code.

  mFusedLocationClient.getLastLocation()
                    .addOnSuccessListener(new OnSuccessListener<Location>() {
                        @Override
                        public void onSuccess(Location location) {
                            // GPS location can be null if GPS is switched off
                            if (location != null) {

                                mLocation = location;

                                if (mFusedLocationClient != null) {
                                    mFusedLocationClient.removeLocationUpdates(mLocationCallback);
                                }
                          } else {
                                startLocationUpdates();
                           }
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(HomeActivity.this, "Error trying to get last GPS location", Toast.LENGTH_SHORT).show();
                            e.printStackTrace();
                        }
                    });

et ci-dessous est mon requestLocationUpdates donc je vais recevoir une demande jusqu'à ce que l'emplacement soit disponible.

private void startLocationUpdates() {
        mSettingsClient.checkLocationSettings(mLocationSettingsRequest)
                .addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
                    @Override
                    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
                        Log.i(TAG, "All location settings are satisfied.");

                        getPackageManager().checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, getPackageName());
                        mFusedLocationClient.requestLocationUpdates(mLocationRequest,
                                mLocationCallback, Looper.myLooper());
                        getLastLocationNewMethod();
                    }
                })
                .addOnFailureListener(this, new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        int statusCode = ((ApiException) e).getStatusCode();
                        switch (statusCode) {
                            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                                Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
                                        "location settings ");
                                try {
                                    ResolvableApiException rae = (ResolvableApiException) e;
                                    rae.startResolutionForResult(HomeActivity.this, 0x1);
                                } catch (IntentSender.SendIntentException sie) {
                                    Log.i(TAG, "PendingIntent unable to execute request.");
                                }
                                break;
                            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                                String errorMessage = "Location settings are inadequate, and cannot be " +
                                        "fixed here. Fix in Settings.";
                                Log.e(TAG, errorMessage);
                                Toast.makeText(HomeActivity.this, errorMessage, Toast.LENGTH_LONG).show();
                                //  mRequestingLocationUpdates = false;
                        }
                        getLastLocationNewMethod();  // this method is where I can get location. It is calling above method. 
                    }
                });
    }

Remarque: Pour plus d'informations, voici GitHub Repo LIEN

0
sushildlh