反应原生无法从蜂窝网络找到位置
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
【讨论】:
谢谢你非常好的回答!以上是关于反应原生无法从蜂窝网络找到位置的主要内容,如果未能解决你的问题,请参考以下文章