web-dev-qa-db-fra.com

Activation du mode localisation Haute précision ou économie de batterie, par programmation, sans que l'utilisateur ait besoin de se rendre dans Paramètres

Pourquoi je demande ceci: (aussi la raison de l'essayer dans une application)

Cela se produit lorsque nous utilisons Google Maps dans Lollipop. Même si l'emplacement est désactivé, il est activé, en mode haute précision après la saisie de l'utilisateur depuis l'application Maps, sans qu'il soit nécessaire de se rendre dans les paramètres.

Une fonctionnalité similaire peut être obtenue pour activer Bluetooth, où l'action est initiée dans mon application; l'utilisateur doit faire un choix, mais l'utilisateur n'est pas redirigé vers les paramètres, à l'aide de:

startActivity(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE));

qui pourrait être trouvé sur BluetoothAdapter , maintenant que nous savons qu’il n’existe pas de LocationAdapter, je me suis donc tourné vers gms-> LocationServices , pratiquement tout ce qui se trouve sous Références de l’API de localisation , Android.location. LocationManager mais rien ne semble indiquer que ACTION_REQUEST_ENABLE est disponible.

J'espère qu'il existe une autre méthode pour la même chose et que plus de gens l'ont essayée.

Notez s'il vous plaît:
context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); ne fonctionne pas comme ça.

18
Pararth

UPDATE 3

Invite l'utilisateur à modifier les paramètres d'emplacement Comme @patrickandroid, mentionné dans les commentaires, le lien de la deuxième mise à jour est rompu

GoogleSamples; Emplacement et options Android - pour la référence du code.

UPDATE 2

GoogleSamples; - pour la référence du code.

Cet exemple repose sur l'exemple LocationUpdates inclus dans ceci repo, et permet à l'utilisateur de mettre à jour les paramètres d'emplacement du périphérique en utilisant un dialogue de localisation.

Utilise SettingsApi pour vérifier que les paramètres système du périphérique sont correctement configuré pour les besoins de localisation de l'application.


UPDATE 1

Services Google Play, version 7.0 (mars 2015) publiés ... 

Paramètres de localisation - Alors que le FusedLocationProviderApi combine plusieurs capteurs pour vous donner l'emplacement optimal, la précision du L’emplacement de votre application dépend toujours des paramètres activé sur l'appareil (GPS, wifi, mode avion, etc.). En utilisant Dans la nouvelle classe SettingsApi, vous pouvez ouvrir une boîte de dialogue Paramètres d’emplacement qui affiche un contrôle à une touche permettant aux utilisateurs de modifier leurs paramètres sans quitter votre application.

Utilisation de l'interface publique SettingsApi 

  • Déterminez si les paramètres système appropriés sont activés sur le périphérique pour exécuter la demande de localisation souhaitée.
  • Vous pouvez éventuellement appeler une boîte de dialogue permettant à l'utilisateur d'activer les paramètres de localisation nécessaires d'un simple toucher.


Laissant la partie précédente pour référence:
Mise à jour/Réponse
Pour tous ceux qui recherchent cette réponse, Services Google Play 7.0
Il ajoute des API pour la détection des lieux et la connexion aux appareils à proximité, améliore les annonces mobiles, les données de remise en forme, les paramètres de localisation, etc. 

Dans les services Google Play 7.0, nous introduisons un mécanisme standard pour vérifiez que les paramètres d'emplacement nécessaires sont activés pour un .__ donné. LocationRequest pour réussir. S'il y a des améliorations possibles, vous peut afficher une commande une touche pour que l'utilisateur modifie ses paramètres sans quitter votre application.

exactly this

Cette API offre une excellente opportunité de créer un bien meilleur utilisateur expérience, en particulier si les informations de localisation sont essentielles pour le expérience utilisateur de votre application, comme ce fut le cas avec Google Maps lorsque ils ont intégré la boîte de dialogue Paramètres d'emplacement et ont vu un dramatique augmentation du nombre d'utilisateurs dans un bon état de localisation.

Source:Blog des développeurs Android: Services Google Play 7.0 - Place tout le monde!

SDK Bientôt disponible!
Nous allons déployer les services Google Play 7.0 sur les prochains jours. Attendez-vous à une mise à jour de cet article de blog, publié documentation et la disponibilité du SDK une fois le déploiement effectué terminé.

mettra à jour le programme l-o-c après la mise en œuvre 

22
Pararth

Basé sur les notes @ user2450263 ci-dessus, voici quelques extraits,

/**
 * Prompt user to enable GPS and Location Services
 * @param mGoogleApiClient
 * @param activity
 */
public static void locationChecker(GoogleApiClient mGoogleApiClient, final Activity activity) {
    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(30 * 1000);
    locationRequest.setFastestInterval(5 * 1000);
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);
    builder.setAlwaysShow(true);
    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result.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(
                                activity, 1000);
                    } 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;
            }
        }
    });
}

Et utilisez-le comme

mGoogleApiClient = new GoogleApiClient
            .Builder(this)
            .enableAutoManage(this, 34992, this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

    locationChecker(mGoogleApiClient, MyActivity.this);

En gros, votre utilisateur recevra un message comme celui-ci, dans lequel il peut activer la localisation en mode Haute précision sans entrer dans les paramètres.Turn on GPS

20
PsyGik

J'ai la solution, testée sur Android 6.0.1 Marshmallow, sur l'événement de bouton OnClick appeler le vide:

private void openGPSSettings() {
    //Get GPS now state (open or closed)
    boolean gpsEnabled = Settings.Secure.isLocationProviderEnabled(getContentResolver(), LocationManager.GPS_PROVIDER);

    if (gpsEnabled) {
        Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCATION_MODE, 0);
    } else {
        Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCATION_MODE, 3);
    }
}

Android doit avoir le débogage USB activé ou être enraciné. Exécutez la commande ci-dessous dans adb Shell (à partir d'un shell racine sur le périphérique ou d'un ordinateur connecté par USB si le périphérique n'est pas root):

pm grant com.example.application.test Android.permission.WRITE_SECURE_SETTINGS

Ajoutez ces autorisations dans le manifeste de l'application:

<uses-permission Android:name="Android.permission.WRITE_SETTINGS" />
<uses-permission Android:name="Android.permission.WRITE_SECURE_SETTINGS" />