React Native中的navigator.geolocation.getCurrentPosition无法工作

13

我正在使用一个真实的安卓设备(版本5.1)

我能够使用react-native-maps确定我的位置(正确地在我的应用程序中显示蓝点位置),并且我能够使用谷歌地图应用程序并进入我的位置(GPS正常工作)。

我尝试了很多方法,比如使用大的超时时间、切换enableHighAccuracy选项、移除选项等等,但都无法获取navigator.geolocation的数据。

以下是我的代码:

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

我遇到了这个问题:ERROR(3): Location request timed out

5个回答

12

我知道现在已经很晚了,但这篇内容或许可以帮到其他人。

从React Native 0.60版本开始,Geolocation已被移除。如果你需要替代方案:

安装react-native-community/geolocation:

npm install @react-native-community/geolocation --save

react-native link @react-native-community/geolocation

然后,要请求访问位置权限,您需要将以下行添加到应用的AndroidManifest.xml中。

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

使用方法:

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

Geolocation.getCurrentPosition(info => console.log(info));

关于 {enableHighAccuracy: true, timeout: 20000, maximumAge: 10000} 是什么意思? - Oliver D
这很奇怪,我不知道为什么我们无法使用当前位置地理定位获取正确的坐标,也不知道哪里有最好的解释。 - DevGe

10

两件事。

1)如果坐标没有被缓存,那么这实际上并不是一个高准确性响应的高超时时间。 2)有些设备在高精度设置上会出现问题。

尝试将超时设为30000毫秒,并删除高精度设置,直到找到适合的设置。

编辑:我找到了我记得来自React Native的长期错误:https://github.com/facebook/react-native/issues/7495

因此,请尝试以下操作:

1)删除maximumAge属性 2)如果仍有问题,请删除第三个参数并使用本机模块的默认值。也就是说,不要发送选项对象。那应该可以解决问题。


谢谢你的回复。我只是从这里 https://developer.mozilla.org/fr/docs/Web/API/Geolocation/getCurrentPosition 把代码粘贴进去,但我正在使用不同的设置 { enableHighAccuracy: false, timeout: 50000, maximumAge: 0 } ,但仍然失败了。 - Badis Merabet
我在打开页面几秒钟后得到了这个结果:https://imgur.com/a/JL40m。但是我无法通过编程获取任何数据。 - Badis Merabet
1
我已经将enableHighAccuracy切换为false和true。是的,我已经在AndroidManifest.xml文件中添加了:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />,但仍然遇到相同的错误。如果您有兴趣,我愿意分享代码。 - Badis Merabet
3
移除最大年龄设置,然后再试一次。不是将其设置为0,而是直接移除它。 - sebastianf182
我已经尝试将maximumAge和options全部移除,但是仍然遇到同样的错误:ERROR(3): Location request timeout。我是那个Github issue上最近一位发表评论的。我已在Github上分享了代码链接。如果您能帮忙看一下就太好了!非常感谢! - Badis Merabet
显示剩余5条评论

5

删除 maximumAge 解决了此处的问题!以防万一,如果有人在2019年或之后仍然遇到此问题


3

要请求位置访问权限,您需要将以下行添加到应用程序的AndroidManifest.xml文件中:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

对于API >= 23的安卓设备,您需要执行额外的步骤进行检查:您需要使用PermissionsAndroid API请求ACCESS_FINE_LOCATION权限。

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

仅在此之后运行navigator.geolocation.getCurrentPosition(success, error, options);


1
我使用这个,它运行良好:{enableHighAccuracy: false, timeout: 50000}
async watchPosition() {
    console.log('watchPosition');        
    await navigator.geolocation.getCurrentPosition(
        (position) => {
          console.log('Position -> ',position);
        },
        (error) => console.log(error)
        {enableHighAccuracy: false, timeout: 50000}
    );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接