反应原生无法从蜂窝网络找到位置

Posted

技术标签:

【中文标题】反应原生无法从蜂窝网络找到位置【英文标题】:react native can't find location from cellular network 【发布时间】:2018-09-26 03:53:11 【问题描述】:

我正在尝试在 react-native 中获取 android 设备 (Android 7.0) 上的经纬度用户位置。当我打开 gps 时,它可以毫无问题地找到位置,但如果我想从 wifi 或地窖网络获取位置并且 gps 已关闭,它会给我错误“没有可用的位置提供程序”。

我在我的 android 清单中有这个权限,并在应用程序中动态检查它们:

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

据我了解 enableHighAccuracy: true 为我提供来自 gps 的位置,而 enableHighAccuracy: false 应为我提供来自 wifi 或地窖网络的位置,但第二个无法正常工作。

这是我的代码:

    let highAccuracySuccess = false;
    let highAccuracyError = false;
    let highAccuracy = true;
    let timeout = 30000;

    let getLowAccuracyPosition = () => 
      console.log("REQUESTING POSITION", "HIGH ACCURACY FALSE");
      navigator.geolocation.watchPosition(
        position => 
          console.log("POSITION NETWORK OK", position);
          this.setState(
            latitude: position.coords.latitude,
            longitude: position.coords.longitude,
            error: null
          );
        ,
        error => 
          console.log(error);
          this.setState(
            error: "error2" + error.message
          );
        ,
        
          enableHighAccuracy: false,
          timeout: 30000,
          maxAge: 0
        
      );
    ;

    if (highAccuracy) 
      console.log("REQUESTING POSITION", "HIGH ACCURACY TRUE");
      const watchId = navigator.geolocation.watchPosition(
        position => 
          // location retrieved
          highAccuracySuccess = true;
          console.log("POSITION GPS OK", position);
          navigator.geolocation.clearWatch(watchId);
          this.setState(
            latitude: position.coords.latitude,
            longitude: position.coords.longitude,
            error: null
          );
        ,
        error => 
          console.log(error);
          this.setState(
            error: error.message
          );
          highAccuracyError = true;
          navigator.geolocation.clearWatch(watchId);
          getLowAccuracyPosition();
        ,
        
          enableHighAccuracy: true,
          timeout: 20000,
          maxAge: 0,
          distanceFilter: 1
        
      );

      setTimeout(() => 
        if (!highAccuracySuccess && !highAccuracyError) 
          getLowAccuracyPosition();
        
      , timeout);
    

【问题讨论】:

【参考方案1】:

根据 Google Android 支持,

如果您关闭设备的位置信息,则任何应用都无法使用您的 设备位置

因此应打开定位服务以确定设备位置。

关于使用enableHighAccuracy: true or false

再次来自 Google Android 支持,

定位服务共有三种模式,设备所有者可以选择其中任何一种。

高精度此模式使用 GPS、Wi-Fi、移动网络和传感器来获得最准确的位置。它使用谷歌的 定位服务可帮助您更快、更准确地估计设备的位置 更准确。

省电此模式使用耗电量较少的来源,例如 Wi-Fi 和移动网络。它使用谷歌的位置服务来帮助 更快、更准确地估计您设备的位置。

仅限设备此模式仅使用 GPS。它不使用 Google 的位置服务来提供位置信息。它可以估计 您设备的定位速度较慢并使用更多电池。

上述模式是在 Android API 23(很可能)中添加的,因此在 API = 23 时,用户选择的模式将决定您获得的准确度。

ios 上,行为也是相同的,只是用户不会像在 Android 中那样拥有明确的模式选项。

TL、DR:无论您使用 Wifi、网络还是 GPS 系统,都应打开定位服务以确定当前位置(iOS 或 Android)。

一些有用的链接:

https://support.google.com/accounts/answer/3467281?hl=en

https://github.com/expo/expo/issues/1339

【讨论】:

谢谢你非常好的回答!

以上是关于反应原生无法从蜂窝网络找到位置的主要内容,如果未能解决你的问题,请参考以下文章

当前位置的 iPhone 蜂窝三角测量

android打开网页,并保存当前位置源码

反应原生检查位置服务是不是在iOS上

如何更改 TextInput 上的光标位置? (反应原生)

我如何在反应原生 webview 中从网页访问当前位置

反应原生地理位置未在真实设备中提供确切位置