реагировать родной не может найти местоположение в сотовой сети

Я пытаюсь получить местоположение пользователя по широте и долготе на устройстве 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);
    }

person Sabriael    schedule 16.04.2018    source источник


Ответы (1)


Согласно поддержке Google Android,

Если вы отключите определение местоположения на своем устройстве, никакие приложения не смогут использовать местоположение вашего устройства.

Следовательно, для определения местоположения устройства необходимо включить службы определения местоположения.

Что касается использования enableHighAccuracy: true or false,

Опять же из поддержки Google Android,

Существует три режима для служб определения местоположения, любой из которых может быть выбран владельцем устройства.

Высокая точность. В этом режиме используются GPS, Wi-Fi, мобильные сети и датчики для определения местоположения с максимальной точностью. Он использует службы определения местоположения Google, чтобы быстрее и точнее определять местоположение вашего устройства.

Экономия заряда батареи В этом режиме используются источники с меньшим расходом заряда, например Wi-Fi и мобильные сети. Он использует службы определения местоположения Google, чтобы быстрее и точнее определять местоположение вашего устройства.

Только устройство. В этом режиме используется только GPS. Он не использует службы геолокации Google для предоставления информации о местоположении. Он может определять местоположение вашего устройства медленнее и расходовать больше заряда батареи.

Вышеупомянутые режимы были добавлены в Android API 23 (наиболее вероятно), поэтому на API ‹= 21 ваше свойство enableHighAccuracy должно было определять тип используемого режима службы определения местоположения. При API> = 23 выбранный пользователем режим будет определять, какую точность вы получите.

В iOS поведение также такое же, за исключением того, что у пользователя не будет явных параметров для режимов, как в Android.

TL, DR: службы геолокации должны быть включены для определения текущего местоположения (iOS или Android) независимо от того, используете ли вы Wi-Fi, сеть или систему GPS.

Некоторые полезные ссылки:

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

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

person Ravi Raj    schedule 16.04.2018
comment
Спасибо, очень хороший ответ! - person Sabriael; 16.04.2018