web-dev-qa-db-fra.com

Android: vérifier si les services de localisation sont activés à l'aide du fournisseur de localisation fusionné

Selon la documentation Android:

L'API des services de localisation Google, qui fait partie des services Google Play, fournit un cadre de haut niveau plus puissant que automatiquement gère les fournisseurs de localisation, le mouvement des utilisateurs et la précision de localisation par rapport à l'API d'emplacement de la plateforme dans Android.location.

Mais en utilisant le fournisseur de localisation fusionné (à partir des API de localisation dans les services Google Play), je ne sais pas comment vérifier si l'utilisateur a activé ou désactivé l'emplacement.

En utilisant le oldAndroid.location c'était simple:

locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

Mais je ne souhaite pas utiliser à la fois le fournisseur de localisation fusionné des services Google Play et le ancien emplacement Android.

Comment puis-je vérifier si l'emplacement est activé par l'utilisateur à l'aide du fournisseur d'emplacement fusionné?

Merci d'avance.

17
josuadas

Voir SettingsApi : vérifiez votre demande de localisation puis assurez-vous que les paramètres système de l'appareil sont correctement configurés pour les besoins de localisation de l'application.

17
Aryan Najafi

Ce tutoriel de formation pour développeur Android pourrait vous aider - voici les bases:

Code à exécuter dans votre activité onCreate ():

 // Create an instance of GoogleAPIClient.
    if (mGoogleApiClient == null) {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    mGoogleApiClient.connect();

    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(10000);
    mLocationRequest.setFastestInterval(5000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);

    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult locationSettingsResult) {

            final Status status = locationSettingsResult.getStatus();
            final LocationSettingsStates LS_state = locationSettingsResult.getLocationSettingsStates();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can initialize location
                    // requests here.

                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied. But could be fixed by showing the user
                    // a dialog.
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(LocationByGPS.this, REQUEST_CHECK_SETTINGS);

                    } catch (IntentSender.SendIntentException e) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way to fix the
                    // settings so we won't show the dialog.

                    break;
            }
        }
    });

Remplace cette méthode:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
    switch (requestCode) {
        case REQUEST_CHECK_SETTINGS:
            switch (resultCode) {
                case Activity.RESULT_OK:
                    // All required changes were successfully made
                    GetUserLocation();//FINALLY YOUR OWN METHOD TO GET YOUR USER LOCATION HERE
                    break;
                case Activity.RESULT_CANCELED:
                    // The user was asked to change settings, but chose not to

                    break;
                default:
                    break;
            }
            break;
    }
}

N'oubliez pas de les implémenter dans votre classe:

public class MyClass extends AppCompatActivity implements
    ActivityCompat.OnRequestPermissionsResultCallback,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener{

  protected static final int REQUEST_CHECK_SETTINGS = 0x1;


  /* 
     your code i.e. with the above code etc....
 */

 }

Bonne explication ici dans ce lien développeur Google.

À votre santé!

36
S bruce

Comme maintenant en 2019

Dernier, meilleur et le plus court est

    public booleanisLocationEnabled()
    {
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// This is new method provided in API 28
                    LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                    return lm.isLocationEnabled();
                } else {
// This is Deprecated in API 28
                    int mode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE,
                            Settings.Secure.LOCATION_MODE_OFF);
                    return  (mode != Settings.Secure.LOCATION_MODE_OFF);

                }
    }
1
Mayank Sharma

Vous pouvez aussi vérifier comme ceci:

LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean isEnabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER);
1
Kumar Snehashish