Приложение React native: не авторизовано для использования служб определения местоположения

#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"/>