web-dev-qa-db-fra.com

navigator.geolocation.getCurrentPosition ne fonctionne pas sur Android google chrome

Ce code:

navigator.geolocation.getCurrentPosition(
                    function(position) {
                        alert(position.coords.latitude, position.coords.longitude);
                    },
                    function(error){
                        alert(error.message);
                    }, {
                        enableHighAccuracy: true
                        ,timeout : 5000
                    }
            );

https://jsfiddle.net/FcRpM/ fonctionne dans Google Chrome sur mon ordinateur portable, mais sur mobile HTC One S (Android 4.1, GPS désactivé, localisation via mobile) réseaux et wifi activé), connecté à Internet via WiFi.

  1. Le navigateur par défaut fonctionne bien.
  2. Google Chrome, Opera, Yandex.browser pour Android échoue avec "Timeout expired".

autres Android me localisent correctement.

32
Andrey Koltsov

Vous pouvez essayer ça. Il semble fonctionner sur mon appareil (Samsung Galaxy Nexus exécutant Chrome 27.0.1453.90 sur Wi-Fi (pas de connexion de données, pas de GPS activé))

navigator.geolocation.getCurrentPosition(
    function(position) {
         alert("Lat: " + position.coords.latitude + "\nLon: " + position.coords.longitude);
    },
    function(error){
         alert(error.message);
    }, {
         enableHighAccuracy: true
              ,timeout : 5000
    }
);

Le problème est que l'alerte ne prend que des chaînes (dans sa forme originale) mais vous passez 2 doubles. Modifiez la boîte d'alerte par exemple en alert('Hey', 'Hello'); et la sortie sera seulement Hey. Changez le , En + Et vous obtiendrez les chaînes concaténées HeyHello. Vous ne pouvez pas utiliser un signe + À l'intérieur du alert car l'équation sera d'abord exécutée puis affichée.

J'espère que cela le rend clair.

17
Adrian

THERE IS A CONTOURNEMENT: à l'appel watchPosition, et l'encapsulation dans une attente de 5 secondes avant d'effacer le watchID. Code ci-dessous;

var options = { enableHighAccuracy: true, maximumAge: 100, timeout: 60000 };
if( navigator.geolocation) {
   var watchID = navigator.geolocation.watchPosition( gotPos, gotErr, options );
   var timeout = setTimeout( function() { navigator.geolocation.clearWatch( watchID ); }, 5000 );
} else {
   gotErr();
}

Je n'ai pas joué avec les valeurs "options" ou le délai d'expiration pour le moment, mais le code ci-dessus ramène des informations de positionnement précises sur chaque plate-forme que j'ai essayée.

8
delkant

Je viens de terminer de tester un tas d'appareils mobiles et la géolocalisation Javascript. J'ai utilisé l'exemple de code de Google afin de m'assurer que le problème n'est pas dans mon propre code.

Chrome pour Android 4.4 ne semble pas fonctionner avec les services de localisation GPS uniquement et le navigateur de stock 2.3 non plus. Ils ont tous deux besoin de "Haute précision" - l'utilisation des réseaux sans fil et 3G/4G.

Ce qui est drôle, c'est que Firefox pour Android fonctionne sans aucun problème uniquement GPS. Seul le stock Android (Chrome + Mobile Safari) échouent)) avec les paramètres de localisation GPS uniquement.

Et le reste du gang - Lumia WP8 avec GPS, Windows et Linux (tous deux avec ADSL) fonctionnait parfaitement avec tous les paramètres de localisation.

6
karvonen

Eh bien, j'ai rencontré ce problème hier et le problème était que l'API de géolocalisation ne peut être utilisée que via HTTPS. Cela fonctionnera sur http://localhost mais pour les autres appareils, vous devez être sur une connexion sécurisée.

J'espère que ça aide!

2
Ajay Gupta

Après plusieurs heures de recherche de solution pour error3, je ne peux que redémarrer mon téléphone et la géolocalisation commence à fonctionner normalement. Dommage...

2
saike

Cela fonctionnait pour moi pour chaque simulateur mais pas pour les appareils Android

ce qui a fonctionné pour moi était

navigator.geolocation.getCurrentPosition(
                (position) => {
                    console.log(position);
                },
                (error) => console.log(new Date(), error),
                { enableHighAccuracy: false, timeout: 5000},
            );

signifie au lieu de trois arguments, j'ai utilisé seulement deux moyens

{enableHighAccuracy: false, timeout: 5000}

1
Sultan Ali