web-dev-qa-db-fra.com

Réaction de la demande de localisation Android native expirée

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

12
İsmail Şener

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
1
İsmail Şener

J'ai enlevé maximumAge: 3600000 sur Android et ça marche

3
Vinh Thai

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.

3
dexter

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 .....

2
Vishal Pachpande

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

0
Arjun G Perambra

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>
    );
  }
}
0
Keshav Gera

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  }
        );
0
Tuan Nguyen