web-dev-qa-db-fra.com

réagir natif navigator.geolocation.getCurrentPosition ne fonctionne pas

J'utilise un vrai appareil Android (version 5.1)

Je suis en mesure de déterminer ma position à l'aide de react-native-maps (position correcte du point bleu sur la carte de mon application) + je peux utiliser l'application google maps et accéder à ma position (GPS fonctionne).

J'utilise un délai d'attente très long, basculant enableHighAccuracy sur true et false, supprime les options, etc. Tous n'ont pas réussi à obtenir navigator.geolocation pour obtenir des données.

Voici mon code:

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0
};

function success(pos) {
  var crd = pos.coords;

  console.log('Your current position is:');
  console.log(`Latitude : ${crd.latitude}`);
  console.log(`Longitude: ${crd.longitude}`);
  console.log(`More or less ${crd.accuracy} meters.`);
};

function error(err) {
  console.warn(`ERROR(${err.code}): ${err.message}`);
};

navigator.geolocation.getCurrentPosition(success, error, options);

Je reçois: ERROR(3): Location request timed out

5
Badis Merabet

Deux choses. 

1) En réalité, le délai d’expiration n’est pas très long pour une réponse de haute précision si les coordonnées ne sont pas mises en cache. 2) Certains périphériques ont des problèmes avec le paramètre highAccuracy. 

Essayez de mettre 30000 ms comme délai d'attente et supprimez la haute précision jusqu'à ce que vous trouviez un réglage qui fonctionne. 

Edit: J'ai trouvé le long bug dont je me souvenais sous la forme React Native: https://github.com/facebook/react-native/issues/7495

Alors, essayez ceci:

1) Supprimez la propriété maximumAge 2) Si cela ne fonctionne pas, supprimez le troisième paramètre et utilisez les valeurs par défaut du module natif. Signification, n'envoie pas l'objet options. Cela devrait fonctionner. 

2
sfratini

Je l'ai utilisé et cela fonctionne bien:{enableHighAccuracy: false, délai d'attente: 50000}

async watchPosition() {
    console.log('watchPosition');        
    await navigator.geolocation.getCurrentPosition(
        (position) => {
          console.log('Position -> ',position);
        },
        (error) => console.log(error)
        {enableHighAccuracy: false, timeout: 50000}
    );
}
1
Johnmark Hugo

Pour demander l'accès à un emplacement, vous devez ajouter la ligne suivante à votre fichier AndroidManifest.xml: <uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />.

Pour un Android avec API> = 23 , vous devez demander une étape supplémentaire pour vérifier: vous devez demander l'autorisation ACCESS_FINE_LOCATION à l'aide de l'API PermissionsAndroid.

PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
      {
        title: "Location Accessing Permission",
        message: "App needs access to your location"
      }
    );

Et seulement après cette exécution navigator.geolocation.getCurrentPosition(success, error, options);

0
David