Ionic 2/Ionic 3: Как получить текущее местоположение устройства

Не ставьте этот вопрос как дубликат, ни один из ответов на stackoverflow не работал для меня. Многие из них предназначены для Ionic 1, или эти ответы устарели или они не работают для устройства Android.

Я видел много решений о stackoverflow о том, как получить текущее местоположение устройства, но не похоже, что они работают на Android.

что я пробовал: -

  • используя geolocation.getCurrentPosition(), который работает для IOS и браузера, но не для Android.

  • используя this.geolocation.watchPosition(), который работает для IOS и браузера, но не для Android.

  • используя navigator.geolocation.getCurrentPosition(), который работает для IOS и браузера, но не для Android.

  • используя скриптовый раствор, предоставленный этим вопросом getCurrentPosition() и watchPosition(), устарели на ненадежном происхождении

В любом случае, все они устарели от Google из-за: -

getCurrentPosition() и watchPosition() устарели на ненадежном происхождении, и поддержка будет удалена в будущем. Вы должны рассмотреть возможность переключения приложения на безопасное происхождение, например HTTPS. См. Goo.gl/rStTGz для получения более подробной информации.

Проблема с joshmorony (https://www.joshmorony.com/adding-background-geolocation-to-ani-ionic-2-application/) на переднем плане не работает на физических устройствах Android, но отлично работает для браузера и ios. Фоновое отслеживание работает отлично, что занимает почти 50 секунд, чтобы дать лат в первый раз.

Пожалуйста, помогите мне с этим. Я хочу, чтобы получить текущее местоположение за минимальное время. Для вашей информации я использую google javascript map sdk/api.

Ответ 1

Я испробовал каждое решение, предоставленное всеми вами и другими людьми, также в Интернете. Наконец-то я нашел решение. Вы можете попробовать этот плагин cordova-plugin-advanced-geolocation (https://github.com/Esri/cordova-plugin-advanced-geolocation) из ESRI. Но этот плагин будет работать для Android, а не IOS. Для IOS вы можете пойти с тем же старым подходом. то есть - используя this.geolocation.getCurrentPosition(...) или this.geolocation.watchPosition(..).

Добавить cordova-plugin-advanced-geolocation Plugin Вот так: -

cordova plugin add https://github.com/esri/cordova-plugin-advanced-geolocation.git

затем

declare var AdvancedGeolocation:any;//наверху класса

//**For Android**


    if (this.platform.is('android')) {
          this.platform.ready().then(() => {
            AdvancedGeolocation.start((success) => {
              //loading.dismiss();
              // this.refreshCurrentUserLocation();
              try {
                var jsonObject = JSON.parse(success);
                console.log("Provider " + JSON.stringify(jsonObject));
                switch (jsonObject.provider) {
                  case "gps":
                    console.log("setting gps ====<<>>" + jsonObject.latitude);

                    this.currentLat = jsonObject.latitude;
                    this.currentLng = jsonObject.longitude;
                    break;

                  case "network":
                    console.log("setting network ====<<>>" + jsonObject.latitude);

                    this.currentLat = jsonObject.latitude;
                    this.currentLng = jsonObject.longitude;

                    break;

                  case "satellite":
                    //TODO
                    break;

                  case "cell_info":
                    //TODO
                    break;

                  case "cell_location":
                    //TODO
                    break;

                  case "signal_strength":
                    //TODO
                    break;
                }
              }
              catch (exc) {
                console.log("Invalid JSON: " + exc);
              }
            },
              function (error) {
                console.log("ERROR! " + JSON.stringify(error));
              },
              {
                "minTime": 500,         // Min time interval between updates (ms)
                "minDistance": 1,       // Min distance between updates (meters)
                "noWarn": true,         // Native location provider warnings
                "providers": "all",     // Return GPS, NETWORK and CELL locations
                "useCache": true,       // Return GPS and NETWORK cached locations
                "satelliteData": false, // Return of GPS satellite info
                "buffer": false,        // Buffer location data
                "bufferSize": 0,         // Max elements in buffer
                "signalStrength": false // Return cell signal strength data
              });

          });
        } else {

          // **For IOS**

          let options = {
            frequency: 1000,
            enableHighAccuracy: false
          };

          this.watch = this.geolocation.watchPosition(options).filter((p: any) => p.code === undefined).subscribe((position: Geoposition) => {
            // loading.dismiss();
            console.log("current location at login" + JSON.stringify(position));

            // Run update inside of Angular zone
            this.zone.run(() => {
              this.currentLat = position.coords.latitude;
              this.currentLng = position.coords.longitude;
            });

          });
        }

РЕДАКТИРОВАТЬ: Первая установка всегда идет хорошо. Но иногда вы можете получить ошибки без причины в последующих установках. Чтобы сделать эту ошибку (любую ошибку с этим плагином), уйдите. Выполните следующие действия:

1. Удалите этот плагин из вашего проекта (включая config.xml и package.json).

2. Удалить/удалить платформу android.

3. Удалить папку plugins.

4. Теперь переустановите этот плагин снова, следуя инструкциям выше.

Ответ 2

Я преодолел проблему и нашел решение.

лучший способ получить геолокацию пользователя - использовать этот плагин https://ionicframework.com/docs/native/geolocation/

не забудьте добавить это app.moudle.ts в качестве поставщика.

просто добавив этот код в компонент приложения, я смог получить местоположение (не забудьте импортировать и добавить в конструктор)

 this.geolocation.getCurrentPosition({ enableHighAccuracy: true }).then((resp) => {
      console.log(resp);
    }, Error => {
      console.log(Error);
    }).catch(Error => {
      console.log(Error);
    })

У меня только такая же ошибка, в то время как я использовал ионный свиной андроид --livereload, который является небезопасным происхождением

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

просто для подтверждения ответа в android я проверяю хром-отладчик.

Ответ 3

У меня возникла аналогичная проблема. Когда я строю с терминала с флагом --prod, я больше не вижу эту ошибку, так как теперь он запрашивает позицию над https.

Построен без флага --prod

Построен с использованием флага --prod

Изменение: Извините за формат, я надеюсь, что это имеет смысл. Я использовал следующую функцию в службе, которую я мог бы позвонить из любого места, чтобы получить широту, долготу, точность и временную метку. Ключ, однако, использует флаг --prod в терминале при создании приложения.

this.geolocation.getCurrentPosition().then(position => {
     let locationObj = {
            lat: position.coords.latitude,
            lon: position.coords.longitude,
            timestamp: position.timestamp,
            accuracy: position.coords.accuracy
     };
resolve(locationObj);
})

Ответ 4

@kumar..sir Я использовал плагин геолокации, и карта не загружается из-за этой ошибки: - Ошибка положения: - каждый раз в реальном устройстве и в браузере разрешено только безопасное происхождение в консоли? Скажите, пожалуйста, сэр, как исправить эту ошибку?

Ответ 5

этот метод работает для бота Android и браузера

watchLocation() {
    this.watchLocationUpdates = this.geolocation.watchPosition({ maximumAge: 60000, timeout: 25000, enableHighAccuracy: true })
      .subscribe(resp => {
        this.latitude = resp.coords.latitude;
        this.longitude = resp.coords.longitude;
        this.altitude = resp.coords.altitude;
        this.accuracy = resp.coords.accuracy;
        this.altAccuracy = resp.coords.altitudeAccuracy;
        this.heading = resp.coords.heading;
        this.speed = resp.coords.speed;
        this.timestamp = new Date(resp.timestamp);
      });
 }

Ответ 6

вам необходимо предоставить разрешение на Android-приложение следующим образом:

<feature name="Geolocation">
    <param name="android-package" value="org.apache.cordova.GeoBroker" />
</feature>

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

Ответ 7

Я нашел решение для меня: используйте google api https://www.googleapis.com/geolocation/v1/geolocate?key={API_KEY} Если на платформе Android я использую google api.