web-dev-qa-db-fra.com

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 les API avaient expiré pour deux raisons et que la même erreur se produisait: 1. Si le GPS n'est pas activé sur le périphérique de l'utilisateur 2. Si le GPS est activé et ne peut pas localiser l’utilisateur (cela peut être dû à plusieurs raisons: GPS défectueux, météo peu claire, etc.)

J'ai un problème pour différencier la cause? Des idées sur la façon de le faire?

Je me demandais s’il existait un moyen quelconque de vérifier si le GPS est activé sur le périphérique de l’utilisateur à l’aide de Phonegap, afin que je puisse le faire en tant que vérification séparée et diriger l’utilisateur vers la fenêtre de configuration où sont généralement placés les paramètres GEO. Vous ne savez pas comment faire ça? un plugin phonegap personnalisé peut être?

20
Anoop Halgeri

Vous pouvez vérifier le code d'erreur dans PositionError paramètre de geolocationError dans votre appel à getCurrentPosition . Je suppose que ce sera PositionError.PERMISSION_DENIED lorsque le GPS n'est pas activé, et PositionError.POSITION_UNAVAILABLE ou PositionError.TIMEOUT lorsque le GPS est activé, mais qu'il existe d'autres problèmes.

Notez que cela dépend de la plate-forme. Vous devrez probablement écrire un message d'erreur artificiel indiquant "Impossible d'obtenir la position actuelle. Les signaux GPS sont faibles ou le GPS a été désactivé".

Une chose que vous pouvez essayer est d'appeler getCurrentPosition avec un délai incroyablement court, disons 1 ms. Si le message indique que l'autorisation est refusée, vous pouvez en conclure que le GPS est désactivé et s'il expire, vous pouvez en déduire que le GPS est activé. Je n'ai pas le temps de tester cela, vous pouvez probablement éditer cette réponse avec le résultat de vos tests.

Une autre chose que vous pouvez essayer est d’utiliser le plugin diagnostic phonegap pour Android . Vous devrez également vous assurer que vous utilisez les plugins pour les autres plates-formes, mais ils sont également tous principalement présents.

37
Kinjal Dixit

Pour gérer ce cas plus facilement, vous pouvez utiliser cordova.plugins.diagnostic pour vérifier si le réglage GPS est activé et (sous Android 6+) pour vérifier si l'application dispose d'une autorisation d'exécution et, le cas échéant, utiliser cordova-plugin-request-location-accuracy pour activer automatiquement le GPS via une boîte de dialogue native sans demander aux utilisateurs de l’activer manuellement via la page des paramètres. Toutefois, comme cette dernière repose sur une bibliothèque de services Google Play à jour sur le périphérique, il est recommandé de recourir à la commutation manuelle en cas d'échec de la commutation automatique.

 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, vous feriez quelque chose comme ça:

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
6
DaveAlden

J'ai eu un problème similaire avec certains appareils. Géré pour le résoudre avec le code ci-dessous:

var options = {maximumAge: 0, timeout: 10000, enableHighAccuracy:true};
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
3
George Artemiou

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

Comme il le dit, ajoutons d'abord les deux plugins:

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

Ajoutez ensuite 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

J'espère que cela aidera quelqu'un d'autre qui viendra avec cette réponse. 

1
OrdinaryHuman

Utilisation de la plateforme Android Apache Cordova 3

Dans le fichier GeoBroker.Java sur la méthode exectute, ajoutez l'action suivante après l'instanciation du gestionnaire 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 le fichier geolocation.js du dossier plugins de vos ressources, ajoutez 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
nicoabie

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

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

0
Morteza Tourani