Я пытаюсь получить местоположение пользователя по широте и долготе на устройстве Android (Android 7.0) в режиме реакции. Когда я включил GPS, он находит местоположение без проблем, но если я хочу получить местоположение из сети Wi-Fi или подвального помещения, а 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 должно давать мне местоположение из Wi-Fi или сети подвала, но второй не работает.
Вот мой код:
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);
}