React Native Android位置请求超时

时间:2016-12-13 19:30:01

标签: android react-native gps react-native-android

在IOS中寻找gps coords时没有问题。它工作正常。

在Android方面,它不像IOS那样稳定。在真实设备和模拟器中都存在这个问题。有时它可以找到位置,但有时不会。寻找3天,但没有找到解决方案。

当我的应用无法找到我的位置时,我尝试使用Google地图应用,就像魅力一样。

以下是IOS和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 }
    );
}

欢迎任何类型的解决方案。

由于

13 个答案:

答案 0 :(得分:6)

我在Android上删除了maximumAge: 3600000并且正在运行

答案 1 :(得分:5)

---------------------------------------------------------------------------
SyntaxError                               Traceback (most recent call last)
<ipython-input-85-ed294a40a103> in <module>
      9 cur.execute("""SELECT * FROM data 
     10             ORDER BY ts DESC
---> 11             WHERE ts = TO_TIMESTAMP('{0}','YYYY-MM-DD HH:MI:SS+00:00')""".format(date_to_choose))
     12 
     13 

SyntaxError: syntax error at or near "WHERE"
LINE 3:             WHERE ts = TO_TIMESTAMP('2020-04-22 06:34:08+00:...
                    ^
import Geolocation from '@react-native-community/geolocation';

此功能对我有用,我已使用

更改了“ AndroidManifest.xml”文件
Geolocation.getCurrentPosition(
      position => {
        const initialPosition = JSON.stringify(position);
        console.log(initialPosition);
      },
      error => Alert.alert('Error', JSON.stringify(error)),
      {enableHighAccuracy: true, timeout: 20000, maximumAge: 1000},
    );

答案 2 :(得分:4)

您可能在建筑物或办公室内,而且您的信号不是那么好。我试过很多配置,这个对我来说最合适:

{
    enableHighAccuracy: false,
    timeout: 5000,
    maximumAge: 10000
}

或尝试增加超时。因为对我来说通常2000毫秒不工作,我不断得到“位置请求超时”。因此,禁用高精度,增加超时,你就可以了。

答案 3 :(得分:3)

您好,我遇到了同样的问题“请求超时”。  我已经尝试了所有可能的解决方案,但是这些解决方案对我来说不起作用,但是最近我找到了一个可以解决此问题的模块。      react-native-geolocation-service 这对我有用.....

答案 4 :(得分:1)

我通过外部库找到了一个使用原生LocationManager的解决方案。它根据需要使用播放服务位置和发射位置事件。

这是图书馆; https://bitbucket.org/timhagn/react-native-google-locations#readme

在为Android编译时,不要忘记包含android/app/build.gradle

dependencies {
    ...
    compile "com.google.android.gms:play-services:10.0.1" -> which version that you have write down here.
    ...
}

最后不要忘记在 Android SDK Manager 中下载Google Play ServicesGoogle Support Library,您可以找到您的播放服务版本;

<android-sdk-location>/<sdk-version>/extras/google/m2repository/com/google/android/gms/play-services

答案 5 :(得分:1)

删除参数“maximumAge”并保留

{ enableHighAccuracy: true, timeout: 2000}

答案 6 :(得分:0)

我已经按照位置请求完成了该应用。命令
{ enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000 },将在iOS上运行,但不能在Android上运行。我认为您应该检查平台。

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  }
        );

答案 7 :(得分:0)

我尝试了各种方法和npm模块。最后,我使用此模块解决了这个问题。我强烈建议这样做。 https://www.npmjs.com/package/react-native-geolocation-service

答案 8 :(得分:0)

工作 {enableHighAccuracy:false,超时:5000,最大年龄:10000},

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

在P列表和android Manifest中添加权限

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>
    );
  }
}

答案 9 :(得分:0)

就我而言,在删除超时和maximumAge并将enableHighAccuracy设置为false之后,它运行良好。

答案 10 :(得分:0)

对于那些仍然面临问题的人,请注意这些参数。我曾经将参数保留为默认值,但是当涉及到 enableHighAcuracy 时,您应该小心,因为将其设置为false时,意味着您请求的是WIFI位置,而不是GPS位置。如果未将其设置为true,则可能会像我一样在模拟器上收到错误消息。

支持的选项:

超时(ms)-是一个正值,表示允许设备返回位置的最大时间长度(以毫秒为单位)。默认为INFINITY。

maximumAge(ms)-是一个正值,表示可以返回的可能缓存位置的最大年龄(以毫秒为单位)。如果设置为0,则意味着设备无法使用缓存的位置,必须尝试检索实际的当前位置。如果设置为Infinity,则设备将始终返回缓存的位置,而不管其寿命如何。默认为INFINITY。

enableHighAccuracy(布尔型)-是一个布尔值,表示是否使用GPS。如果设置为true,则将请求GPS位置。如果设置为false,将请求WIFI位置。

Detailed Documentation

答案 11 :(得分:0)

我建议考虑两种处理方式:

  1. 使用 react-native-geolocation-service - 一个可以解决这个问题的包。
  2. 尝试使用 enableHighAccuracy=true 调用一次,如果失败,请尝试使用 enableHighAccuracy=false 再次调用它。
    详细信息:似乎 enableHighAccuracy=true 尝试通过 GPS 获取位置 - 当 enableHighAccuracy=false 时,设备首先尝试通过 Wifi 获取位置,如果失败,则尝试通过 GPS 获取。

以下是我实现第 2 项的方法:

import Geolocation from "@react-native-community/geolocation";

const getCurrentLocation = (resolve, enableHighAccuracy, onError) => {
    console.log(`[getCurrentPosition] enableHighAccuracy=${enableHighAccuracy.toString()}`);

    Geolocation.getCurrentPosition(
        (position) => {
            const location = {
                latitude: position.coords.latitude,
                longitude: position.coords.longitude
            }
            console.log('[getCurrentPosition] success');
            resolve(location);
        },
        onError,
        {enableHighAccuracy, timeout: 20000}
    );
};

/**
 * We first try to get location with enableHighAccuracy=true (try to get position via GPS) if it fails try to get it with enableHighAccuracy=false (try to get position from wifi)
 * @return {Promise}
 */
export const getCurrentPosition = () => {
    return new Promise((resolve) => {
        getCurrentLocation(resolve, true,
            (error1) => {
                // failed to retrieve with enableHighAccuracy=true - now try with enableHighAccuracy=false
                console.log(`[getCurrentPosition] failed 1st time trying again with enableHighAccuracy=false, error: ${error1.message}`);

                getCurrentLocation(resolve, false, (error2) => {
                    // Could not retrieve location - we can live with that
                    console.log(`[getCurrentPosition] failed ${error2.message}`);
                    resolve();
                })
            });
    });
}

答案 12 :(得分:-3)

如果你设置了

,那么技巧就是
{ enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000 } 
然后它会起作用。完整的代码如下。

import React, { Component } from 'react';
import { View, Text } from 'react-native';

class GeolocationExample 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: true, timeout: 25000, maximumAge: 3600000 },
);}

 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>
  );
 }
}

export default GeolocationExample;