Dans IOS, la recherche de coordonnées gps ne pose aucun problème. Ça fonctionne bien.
Du côté Android, ce n'est pas stable comme iOS. Ce problème à la fois dans le périphérique réel et émulateur. Parfois, il peut trouver un emplacement, mais parfois pas. Vous cherchez 3 jours mais il n'y avait pas de solution.
Lorsque mon application ne peut pas trouver ma position, j'ai essayé via l'application Google Maps, cela fonctionne comme un charme.
Voici mon code pour IOS et Android;
getCurrentPosition() {
navigator.geolocation.getCurrentPosition(
(position) => {
this.setState({ initialPosition: position });
alert(JSON.stringify(position))
var coords = new Coords();
coords.Latitude = position.coords.latitude;
coords.Longitude = position.coords.longitude;
this.getPharmaciesByCoordinates(coords);
},
(error) => alert(error.message),
{ enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 }
);
this.watchID = navigator.geolocation.watchPosition((position) => {
this.setState({ initialPosition: position });
},
(error) => alert(error.message),
{ enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 }
);
}
Toute solution est la bienvenue.
Merci
J'ai trouvé une solution via une bibliothèque externe qui utilise LocationManager
en natif. Il utilise l’emplacement des services de lecture et l’événement d’emplacement d’émission comme je le souhaite.
Voici la bibliothèque: https://bitbucket.org/timhagn/react-native-google-locations#readme
Et lors de la compilation pour Android, n'oubliez pas d'inclure Android/app/build.gradle
dependencies {
...
compile "com.google.Android.gms:play-services:10.0.1" -> which version that you have write down here.
...
}
Et enfin, n'oubliez pas de télécharger Google Play Services
et Google Support Library
dans Android SDK Manager dans lequel vous pouvez trouver les versions de vos services de jeu;
<Android-sdk-location>/<sdk-version>/extras/google/m2repository/com/google/Android/gms/play-services
J'ai enlevé maximumAge: 3600000
sur Android et ça marche
Il est possible que vous vous trouviez à l'intérieur de l'immeuble ou du bureau et votre signal n'est pas très bon. J'ai essayé avec plusieurs configurations et celle-ci me convenait le mieux:
{
enableHighAccuracy: false,
timeout: 5000,
maximumAge: 10000
}
Ou essayez d'augmenter le délai d'attente. Parce que, pour moi, les 2000 ms habituels ne fonctionnaient pas, je continuais à recevoir "demande de localisation expirée". Donc, désactivez la haute précision, augmentez le délai d’attente et vous êtes prêt à partir.
Bonjour, je faisais face au même problème "demande de temps mort" . J'ai essayé toutes les solutions possibles que j'ai trouvées mais celles-ci ne pouvaient pas fonctionner pour moi, mais récemment j'ai trouvé un module qui résout ce problème . react-native-geolocation-service Cela a fonctionné pour moi .....
J'ai essayé diverses méthodes et modules npm. Enfin, j'ai résolu ce problème en utilisant ce module. Je suggère fortement ceci . https://www.npmjs.com/package/react-native-geolocation-service
Fonctionnement {enableHighAccuracy: false, délai d'expiration: 5000, maximumAge: 10000},
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
Ajouter une autorisation dans la liste P et le manifeste Android également
import React, { Component } from 'react';
import { View, Text } from 'react-native';
export default class App extends Component {
constructor(props) {
super(props);
this.state = {
latitude: null,
longitude: null,
error: null,
};
}
componentDidMount() {
navigator.geolocation.getCurrentPosition(
(position) => {
this.setState({
latitude: position.coords.latitude,
longitude: position.coords.longitude,
error: null,
});
},
(error) => this.setState({ error: error.message }),
{ enableHighAccuracy: false, timeout: 5000, maximumAge: 10000 },
// { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 },
);
}
render() {
return (
<View style={{ flexGrow: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Latitude: {this.state.latitude}</Text>
<Text>Longitude: {this.state.longitude}</Text>
{this.state.error ? <Text>Error: {this.state.error}</Text> : null}
</View>
);
}
}
J'ai fait l'application par demande d'emplacement. La commande{ enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000 },
fonctionnera sur iOS mais pas sous Android. Je pense que vous devriez vérifier la plate-forme.
navigator.geolocation.getCurrentPosition(
(location) => {
console.log('location ', location);
if (this.validLocation(location.coords)) {
this.locationToAddress(location.coords);
}
},
(error) => {
console.log('request location error', error);
},
Platform.OS === 'Android' ? {} : { enableHighAccuracy: true, timeout: 20000, maximumAge: 10000 }
);