web-dev-qa-db-ja.com

Ionic 2 / Ionic 3:デバイスの現在位置を取得する方法

この質問に重複マークを付けないでください。stackoverflowに関する回答はありません。多くの人がIonic 1に対応しています。またはこれらの回答は非推奨であるか、機能していません。 Androidデバイス。

私はstackoverflowでデバイスの現在の位置を取得することについて多くのソリューションを見てきましたが、それらのどれもがAndroidで機能しているようです。

私が試したこと:-

  • geolocation.getCurrentPosition()を使用します。これは[〜#〜] ios [〜#〜]およびbrowserで動作しますが、Androidでは動作しません。

  • this.geolocation.watchPosition()を使用します。これは[〜#〜] ios [〜#〜]およびbrowserで動作しますが、Androidでは動作しません。

  • navigator.geolocation.getCurrentPosition()を使用すると、[〜#〜] ios [〜#〜]およびbrowserで動作しますが、Androidでは動作しません。

  • この質問によって提供されるフィドルソリューションを使用する getCurrentPosition()およびwatchPosition()は安全でないオリジンで非推奨です

とにかく、これらはすべて非推奨

getCurrentPosition()およびwatchPosition()は、安全でないオリジンでは非推奨であり、サポートは将来削除されます。アプリケーションをHTTPSなどの安全なOriginに切り替えることを検討する必要があります。詳細については、goo.gl/rStTGzを参照してください。

joshmoronyhttps://www.joshmorony.com/adding-background-geolocation-to-an-ionic-2-application/ )ソリューションの問題は、フォアグラウンドがAndroid物理デバイスですが、ブラウザとiosに対しては正常に動作しています。バックグラウンドトラッキングは正常に動作しています。

これで私を助けてください。最短時間で現在地を取得する方法が必要です。ご参考までに、Google javascriptmap sdk/apiを使用しています。

20
kumar kundan

インターネット上であなたと他の人が提供するすべてのソリューションを試しました。最後に解決策を見つけました。このプラグインを試すことができますcordova-plugin-advanced-geolocation(- https://github.com/Esri/cordova-plugin-advanced-geolocation )from[〜#〜] esri [〜#〜]。ただし、このプラグインはAndroidでは機能しません[〜#〜] ios [〜#〜]。 iOSの場合は、同じ古いアプローチを使用できます。すなわち-this.geolocation.getCurrentPosition(...)またはthis.geolocation.watchPosition(..)を使用します。

追加cordova-plugin-advanced-geolocationプラグインこのように:-

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's zone
            this.zone.run(() => {
              this.currentLat = position.coords.latitude;
              this.currentLng = position.coords.longitude;
            });

          });
        }

[〜#〜] edit [〜#〜]:最初のインストールは常にうまくいきます。ただし、その後のインストールで理由なくエラーが発生する場合があります。このエラー(このプラグインのエラー)をなくすには、次の手順を実行します。

1。このプラグインをプロジェクトから削除します(config.xmlおよびpackage.json)。

2。Androidプラットフォームを削除/削除します。

3。pluginsフォルダーを削除します。

4。上記の手順に従って、このプラグインを再インストールします。

3
kumar kundan

私は問題を経験し、解決策を見つけました。

ユーザーの位置情報を取得する最良の方法は、このプラグインを使用することです https://ionicframework.com/docs/native/geolocation/

プロバイダーとしてapp.moudle.tsを追加することを忘れないでください。

アプリコンポーネントにこのコードを追加するだけで、場所を取得できました(constructorにインポートして追加することを忘れないでください)

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

安全なOriginionic cordova run Android --livereloadを使用しているときにのみ同じエラーが発生します

しかし、ionic serveを使用すると、ブラウザで応答を見ることができ、ionic cordova run Android

Android私はchromeデバッガをチェックします。

2
amyogiji

同様の問題に遭遇しました。 --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);
})
0
Justin B

このメソッドは、ボットAndroid and browser

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);
      });
 }
0
Asad Riaz