#react-native #google-maps-api-3 #geolocation
#react-native #google-maps-api-3 #геолокация
Вопрос:
В настоящее время я работаю над проектом, который использует службу геолокации моего телефона. В настоящее время у меня есть проблема с этой службой, в ней говорится, что геолокация не авторизована.
Я пытался посмотреть в Интернете, и у нескольких человек была такая же проблема, но мне не удалось ее исправить…
componentDidMount() {
const { coordinate } = this.state;
this.requestCameraPermission();
this.watchID = navigator.geolocation.watchPosition(
position => {
const { routeCoordinates, distanceTravelled } = this.state;
const { latitude, longitude } = position.coords;
const newCoordinate = {
latitude,
longitude
};
console.log({ newCoordinate });
coordinate.timing(newCoordinate).start();
this.setState({
latitude,
longitude,
routeCoordinates: routeCoordinates.concat([newCoordinate]),
distanceTravelled:
distanceTravelled this.calcDistance(newCoordinate),
prevLatLng: newCoordinate
});
},
error => console.log(error),
{
enableHighAccuracy: true,
timeout: 20000,
maximumAge: 1000,
distanceFilter: 10
}
);
}
Вместо того, чтобы появляться на моем текущем месте, я нахожусь в Сан-Франциско (который является местоположением по умолчанию на картах).
Функция navigator.geolocation.watchPosition выдает ошибку :
«код»: «E_LOCATION_UNAUTHORIZED»,
«сообщение»: «Не авторизован для использования служб определения местоположения»,
«watchId»: 1,
Мой телефон Samsung S9, и служба определения местоположения включена… Итак, мне действительно интересно узнать о проблеме, с которой я столкнулся прямо сейчас.
Ответ №1:
Спасибо за ваш ответ, мне удалось решить мою проблему, по-видимому, expo по какой-то причине не разрешили использовать мое местоположение, поэтому я просто заставил его :
Location.requestPermissionsAsync();
Ответ №2:
import * as Permissions from 'expo-permissions';
await Permissions.askAsync(Permissions.LOCATION);
Альтернативный метод, если requestPermissionsAsync(); не может работать.
Комментарии:
1. Этому ответу всего 2 дня, но, похоже, вы не проверили документы, так как обе вещи были изменены. Разрешения добавляются к их соответствующим пакетам, а также в Location теперь у нас есть отдельные разрешения для местоположения на переднем плане и фонового местоположения. Пожалуйста, проверьте. Кстати, я здесь, чтобы найти какой-то ответ на эту проблему. Для меня это зависит от конкретного устройства еще и потому, что на snack.expo.io и на одном из моих устройств он работает нормально, но на другом устройстве он показывает ошибку, а также блокирует доступ к местоположению, даже не запрашивая меня.
2. Я использую expo 36, если я правильно помню
Ответ №3:
Если вы используете Expo client на своем мобильном устройстве, пожалуйста, убедитесь, что вы включили разрешение на определение местоположения.
Если вы уже дали разрешение, проверьте свойAndroidManifest.xml для <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
этих местоположений.
Комментарии:
1. При тестировании этого я добавляю это в
debug/AndroidManifest.xml
илиmain/AndroidManifest.xml
? Это должно быть в обоих?
Ответ №4:
У меня был случай, когда iOS
все работало нормально, не запрашивая явно в .ts
коде никаких разрешений. Однако Android
появилось это предупреждение Not authorized to use location services
. У Permissions
теперь немного другой синтаксис, вот пример с Location
.
if (Platform.OS !== "web") {
const { status } = await Location.requestForegroundPermissionsAsync();
if (status !== "granted") {
Alert.alert(
"Insufficient permissions!",
"Sorry, we need location permissions to make this work!",
[{ text: "Okay" }]
);
return;
}
}
(в общем) Ничего не перепутайте вAndroidManifest.xml , как <uses-permission android:name=...
, потому что любые Expo
потребности будут генерироваться автоматически. Это относится к Location
, ссылаясь на официальные документы:
«Некоторые модули Expo и React Native включают разрешения по умолчанию. Например, если вы используете expo-location, подразумеваются как ACCESS_COARSE_LOCATION, так и ACCESS_FINE_LOCATION, которые автоматически добавляются к разрешениям вашего приложения. «
Ответ №5:
Если вы используете, react native
вам может потребоваться добавить следующее в свой AndroidManifest.xml
файл,
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>