Utilisez PhoneGap pour vérifier si le GPS est activé

je construis une application en utilisant PhoneGap. En utilisant l'API de géolocalisation de phonegap, j'ai réalisé que L'API s'arrête pour deux raisons et que la même erreur est jetée.: 1. Si le GPS n'est pas activé sur l'appareil de l'utilisateur 2. Si le GPS est activé et n'est pas en mesure d'obtenir la localisation de l'utilisateur (peut-être plusieurs raisons, GPS défectueux, mauvais temps et ainsi de suite)

j'ai un problème à différencier la cause? Toute réflexion sur la façon de le faire?

je me demandais si il n'y a aucune de cette façon, je peux vérifier si le GPS est actif sur l'appareil de l'utilisateur en utilisant Phonegap, de sorte que je peux le faire comme une vérification séparée et diriger l'utilisateur vers la fenêtre de paramètres où les paramètres typiquement géo sont placés. Vous ne savez pas comment faire? un plugin phonegap personnalisé peut être?

20
demandé sur Anoop Halgeri 2012-10-22 11:06:34

6 réponses

Vous pouvez vérifier le code d'erreur dans PositionError paramètre geolocationError dans votre getCurrentPosition. Je suppose que ce sera PositionError.PERMISSION_DENIED lorsque le gps n'est pas activé, et PositionError.POSITION_NON disponible ou PositionError.TIMEOUT lorsque le gps est activé, mais il y a d'autres problèmes.

notez que cela dépend de la plateforme. Vous devriez probablement écrire un message d'erreur artificiel qui dit "Ne pouvait pas obtenir la position actuelle. Soit les signaux GPS sont faibles, soit le GPS a été désactivé".

une chose que vous pouvez essayer est d'appeler getCurrentPosition avec un délai incroyablement petit, disons 1 ms. Si la permission est refusée, vous pouvez conclure que le gps est désactivé et si le temps passe, vous pouvez supposer que le gps est activé. Je n'ai pas le temps de tester cela, vous pourriez probablement modifier cette réponse avec le résultat de vos tests.

une Autre chose que vous pouvez faire est d'utiliser la diagnostic phonegap plugin pour android. Vous devrez assurez-vous d'utiliser les plugins pour les autres plates-formes, mais ils sont aussi la plupart du temps.

36
répondu Kinjal Dixit 2015-07-09 07:11:53

Pour gérer ce cas le plus gracieusement, vous pouvez utiliser cordova.plugins.diagnostic pour vérifier si le réglage GPS est activé et (sur Android 6+) vérifier si app a l'autorisation d'exécution, et (si elle n'est pas activée), utiliser cordova-plugin-request-location-accuracy pour activer automatiquement le GPS par l'intermédiaire d'une boîte de dialogue native sans que les utilisateurs ne soient obligés de l'activer manuellement via la page des paramètres. Toutefois, étant donné que ce dernier s'appuie sur une bibliothèque de services de Lecture Google mise à jour sur L'appareil, il est de bonne pratique de revenir au manuel de commutation si la commutation automatique échoue.

Example app demo

ajoutez D'abord les plugins nécessaires à votre projet:

cordova plugin add cordova.plugins.diagnostic --save
cordova plugin cordova-plugin-request-location-accuracy --save

Ensuite, tu ferais quelque chose comme ceci:

function checkAvailability(){
    cordova.plugins.diagnostic.isGpsLocationAvailable(function(available){
        console.log("GPS location is " + (available ? "available" : "not available"));
        if(!available){
           checkAuthorization();
        }else{
            console.log("GPS location is ready to use");
        }
    }, function(error){
        console.error("The following error occurred: "+error);
    });
}

function checkAuthorization(){
    cordova.plugins.diagnostic.isLocationAuthorized(function(authorized){
        console.log("Location is " + (authorized ? "authorized" : "unauthorized"));
        if(authorized){
            checkDeviceSetting();
        }else{
            cordova.plugins.diagnostic.requestLocationAuthorization(function(status){
                switch(status){
                    case cordova.plugins.diagnostic.permissionStatus.GRANTED:
                        console.log("Permission granted");
                        checkDeviceSetting();
                        break;
                    case cordova.plugins.diagnostic.permissionStatus.DENIED:
                        console.log("Permission denied");
                        // User denied permission
                        break;
                    case cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS:
                        console.log("Permission permanently denied");
                        // User denied permission permanently
                        break;
                }
            }, function(error){
                console.error(error);
            });
        }
    }, function(error){
        console.error("The following error occurred: "+error);
    });
}

function checkDeviceSetting(){
    cordova.plugins.diagnostic.isGpsLocationEnabled(function(enabled){
        console.log("GPS location setting is " + (enabled ? "enabled" : "disabled"));
        if(!enabled){
            cordova.plugins.locationAccuracy.request(function (success){
                console.log("Successfully requested high accuracy location mode: "+success.message);
            }, function onRequestFailure(error){
                console.error("Accuracy request failed: error code="+error.code+"; error message="+error.message);
                if(error.code !== cordova.plugins.locationAccuracy.ERROR_USER_DISAGREED){
                    if(confirm("Failed to automatically set Location Mode to 'High Accuracy'. Would you like to switch to the Location Settings page and do this manually?")){
                        cordova.plugins.diagnostic.switchToLocationSettings();
                    }
                }
            }, cordova.plugins.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY);
        }
    }, function(error){
        console.error("The following error occurred: "+error);
    });
}

checkAvailability(); // start the check
5
répondu DaveAlden 2016-07-16 10:42:26

j'ai eu un problème similaire avec certains appareils. Réussi à le résoudre avec le code ci-dessous:

var options = {maximumAge: 0, timeout: 10000, enableHighAccuracy:true};
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
3
répondu George Artemiou 2013-10-28 16:54:49

J'ai essayé la solution de DaveAlden ci-dessus mais elle n'a pas fonctionné, en partie parce que la première fonction qu'il appelle cordova.plugins.diagnostic.isGpsLocationAvailable() est Androïde seulement par le plugin docs.

comme il dit, ajoutez d'abord les deux plugins:

cordova plugin add cordova.plugins.diagnostic --save
cordova plugin cordova-plugin-request-location-accuracy --save

Puis ajouter les fonctions suivantes:

// Checks to see if GPS is enabled AND if the app is authorized
checkEnabled(){
    cordova.plugins.diagnostic.isLocationAvailable(
      (available) => { onSuccess(available); },
      (error) => { goToSettings(error); }
    );
}

onSuccess(available) {
  if(available) { // do something };
  else goToSettings(available);
}

// Output error to console
// Prompt user to enable GPS, on OK switch to phone settings
goToSettings(error) {
  console.log("error: ", error);
  if(window.confirm("You need to enable location settings to use the geolocation feature.")) {
    cordova.plugins.diagnostic.switchToSettings();
  }
}

checkEnabled(); // Run check

Espérons que cela aide quelqu'un d'autre qui vient le long de cette réponse.

1
répondu OrdinaryHuman 2017-05-10 19:20:36

utilisation de la plate-forme android apache cordova 3

Dans le GeoBroker.le fichier java sur la méthode Execute ajoute l'action suivante après l'instanciation du locationManager.

if(action.equals("isGPSEnabled")){
            PluginResult result;
            if ( locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER )){
                result = new PluginResult(PluginResult.Status.OK);
            }else{
                result = new PluginResult(PluginResult.Status.ERROR);
            }
            callbackContext.sendPluginResult(result);
        }

Puis dans la géolocalisation.fichier js dans le dossier plugins de vos actifs ajouter le exposer la nouvelle fonctionnalité

 /**
     * Asynchronously checks if gps is enabled.
     *
     * @param {Function} successCallback    The function to call when gps is enabled.
     * @param {Function} errorCallback      The function to call when gps is not enabled. (OPTIONAL)
     */
    isGPSEnabled:function(successCallback, errorCallback){
        exec(successCallback, errorCallback, "Geolocation", "isGPSEnabled", []);
    }

j'Espère que ça aide

0
répondu nicoabie 2013-11-06 13:54:16

juste pour les nouveaux utilisateurs redirigés ici il y a un plugin (qui a commencé vers le milieu de 2014) qui s'appelle Cordova diagnostic plugin:

Ce plugin Cordova/Phonegap pour iOS, Android et Windows 10 Mobile est utilisé pour gérer les paramètres de l'appareil tels que L'emplacement, Bluetooth et WiFi. Il permet la gestion des permissions d'exécution, du matériel core fonctionnalités du système d'exploitation. ref

0
répondu Morteza Tourani 2016-07-02 05:39:15