web-dev-qa-db-fra.com

la géolocalisation de phonegap échoue toujours lors du dépassement de délai

J'utilise sencha-touch 2.0 et phonegap 2.0.0 dans mon application pour récupérer l'emplacement de l'utilisateur. Lorsque je cours sur mon locahost, tout fonctionne correctement. Toutefois, lors du chargement du fichier .apk sur le périphérique de mon Android 15 api (à l'aide d'Eclipse et du plugin adt), chaque appel à getCurrentLocation ou à watchPosition ne revient jamais ...

voici mon code:

geoOn: function(){
    var geoReady = navigator.geolocation || undefined;

    var onSuccess = function(position){
            Top5.app.alert('Geolocation success '+String(position.coords.latitude) + ' ' + String(position.coords.longitude),'Geolocation');
            var scope = Ext.getCmp('nestedList');
            scope.updateDistance(position.coords);
    };

    var onFailure = function(error){Top5.app.alert('Geolocation failed: '+String(error.code) + ' '+String(error.message),'Geolocation');};
    if (geoReady) {
        this.watchId = navigator.geolocation.watchPosition(onSuccess ,onFailure,{timeout:6000,maximumAge: 3000,enableHighAccuracy: true});    
    }
    else{
        Ext.device.Geolocation.watchPosition({
                 frequency: 3000, // Update every 3 seconds
                 callback: function(position) {
                        this.updateDistance(position.coords);
                 },
                 failure: function() {
                   console.log('Geolocation Failure!');
                 },
                 scope:this
        });
    }
 },
 geoGet: function(){
     var geoReady = navigator.geolocation || undefined;
     if (geoReady) {

         var onSuccess = function(position){
             Top5.app.alert('Geolocation successful!!!');
             var scope = Ext.getCmp('nestedList');
             scope.updateDistance(position.coords);          
         };
         var onFailure = function(error){Top5.app.alert('Geolocation failed: '+String(error.code) + ' '+String(error.message),'Geolocation');};
         navigator.geolocation.getCurrentPosition(onSuccess,onFailure);
     }
     else{}
 },
 geoOff:function(){

     var geoReady = navigator.geolocation || undefined;
     if (geoReady) {
         navigator.geolocation.clearWatch(this.watchId);
         this.watchId = null;
     }
     else{
         Ext.device.Geolocation.clearWatch();
     }

 },
 updateDistance:function(coords){
     Top5.app.alert('updateDist','');
     var scope = Ext.getCmp('nestedList');
     var lat = coords.latitude,lon = coords.longitude;
     var store = scope.getStore();
     var i,record;
     for(i = 0; i < store.data.all.length; i++)
     {
         record = store.data.all[i];
         if(record.data.locationX){
            record.set('distance',Top5.app.getDistance(record.data.locationX,record.data.locationY,lat,lon).toFixed(3));
         }   
     }
}

MISE À JOUR: Alors je suis sorti de mon immeuble et cela a fonctionné ... je dois aller à l'extérieur plus souvent.
Cependant, lorsque je désactive le GPS, je pensais que geoLocation trouverait mon emplacement à l’aide de la connexion wifi - mais cela échouait (je règle enableHighAccuracy: false). Pourquoi donc?

UPDATE: Permettez-moi de reformuler ma question: Est-ce que navigator.geolocation.watchPosition suppose de fonctionner à la fois avec le signal GPS et les signaux wifi/g3? Comment puis-je détecter l'emplacement de l'utilisateur en utilisant uniquement une connexion Internet? actuellement, mon code ne fonctionne qu'avec le GPS, et lorsque cette option est désactivée ou que le signal est bloqué, la géolocalisation ne fonctionne pas.

16
gsuoyb

Je sais que c'est peut-être trop tard, mais aujourd'hui, je me suis battu avec le même problème! La solution s'est avérée très simple!

SOLUTION: Redémarrez le périphérique.

C'est tout. 

Le problème est que vous ne savez jamais quand un utilisateur recevra ce type de bogue. Par conséquent, si votre application s'appuie fortement sur la géolocalisation, je vous recommande de définir un délai d'expiration dans les options de localisation navigator.geolocation.getCurrentPosition(geoSuccess, geoError, {timeout: 15000}) et d'alerter l'utilisateur sur le problème et sur la solution possible.

P.S. N'oubliez pas que la géolocalisation peut expirer si, par exemple, les données mobiles sont désactivées, le redémarrage ne le résout pas toujours. Sur iPhone, les données cellulaires sont utilisées pour obtenir votre position, mais sur Android, il semble que le téléphone n’a pas accès aux données cellulaires, sauf si la 3G est activée.

31
Arthur

Cela peut sembler stupide, mais avez-vous activé l'option "Utiliser les réseaux"?

Allez dans Paramètres -> Localisation et sécurité -> Utiliser les réseaux; et l'activer. J'ai passé toute l'après-midi à regarder le problème et c'était tout.

7
user1671553

J'ai redémarré et redémarré. Je réinitialise mon téléphone aux paramètres d'usine. 

Mais rien n'a fonctionné.

Jusqu'à ce que je mette enablHighAccuracy de true à false. 

Et ... Tada .... ça marche. 

Alors : 

var options;

options = {
    maximumAge: 30000,
    timeout: 5000,
    enableHighAccuracy: false
};

Cela fonctionnait très bien avec PhoneGap 2.6.0. J'avais besoin de ce changement car j'utilise maintenant Phonegap 3.3 - testé sur un téléphone Wiko Cink +.

5
Alain Zelink

Si vous utilisez un émulateur, cela peut être dû au fait que le périphérique ne dispose pas d'un ensemble de géolocalisation. Essayez de définir l'emplacement en exécutant ce qui suit en supposant que votre émulateur Android est sur le port 5554:

telnet localhost 5554
geo fix -0.001 51.5
2
Blueberry

Essayez de supprimer le plug-in de géolocalisation du plug-in Phonegap de votre projet. Vous n'avez pas besoin de modifier votre code JavaScript car votre appareil aura recours à la fonctionnalité standard HTML5 navigator.geolocation qui a la même signature de méthode.

En supposant que vous utilisiez PhoneGap 3.3, il vous suffit de lancer:

cordova plugin rm org.Apache.cordova.geolocation
1
Ian

D'après mon analyse des essais et des erreurs, il est très probable que: 1. La version d'Android que vous utilisez. Sur Lollipop et les versions inférieures, vous devrez peut-être accéder aux paramètres de localisation des téléphones et activer les paramètres de haute précision (en utilisant les réseaux gps, wlan et mobile pour obtenir la localisation). Je devais le faire sur un téléphone KitKat. 2. Comme d’autres l'ont mentionné, vous pouvez essayer de modifier les paramètres de getCurrentPosition en activant/désactivant la précision élevée et en ajoutant un délai d'attente. 3.Si vous Avec ngCordova, assurez-vous de l’avoir bien installé et les fonctions de localisation sont en train d’être appelées. Utiliser la console pour vérifier

0
Emmanuel N K

Cela est arrivé à une application en fonctionnement après la mise à jour de PhoneGap vers la version 3.6.3 à partir de 3.5. Après avoir essayé beaucoup d'autres suggestions, la réponse d'Arthur fonctionna. 15 secondes me semblaient trop longues alors j’ai utilisé {timeout: 2000}. Je suppose que la nouvelle version est plus lente car mon code fonctionnait bien avant la mise à jour sur les mêmes appareils. Je pensais que je posterais et que je l'inviterais, car tout ce que j'ai trouvé dans Google concernait la configuration initiale et la plupart du temps, peu pertinent pour ma situation.

0
user2246924

Essayez cette solution:

window.setInterval(checkPosition, 5000);

function checkPosition() {
 function onSuccess(position) {
    document.getElementById('result1').innerHTML = position.coords.latitude;
    document.getElementById('result2').innerHTML = position.coords.longitude;
 }

 // onError Callback receives a PositionError object
 //
 function onError(error) {
    alert('code: '    + error.code    + '\n' +
        'message: ' + error.message + '\n');
 }
 navigator.geolocation.getCurrentPosition(onSuccess, onError);
}
0
tomW

Redémarrez votre téléphone ou allez sur google map et vérifiez si le gps fonctionne là-bas. Je le fais fonctionner.

0
Rohit Patel

Vous devez simplement ajouter enableHighAccuracy: true, maximumAge: 60000 et ensuite redémarrer votre appareil .

0
Roman Galochkin