Ionique 2/ ionique 3: Comment obtenir l'emplacement actuel d'un appareil

ne cochez pas cette question en double, aucune des réponses sur stackoverflow a travaillé pour moi. Beaucoup d'entre eux sont pour ionique 1 ou ces réponses sont obsolètes ou ils ne travaillent pas pour appareil android.

j'ai vu beaucoup de solutions sur stackoverflow à propos de l'emplacement actuel de l'appareil, mais aucun ne semble fonctionner pour Android .

ce que j'ai essayé:-

  • en utilisant geolocation.getCurrentPosition(), qui fonctionne pour IOS et navigateur mais pas Android.

  • en utilisant this.geolocation.watchPosition(), qui fonctionne pour IOS et navigateur mais pas Android.

  • en utilisant navigator.geolocation.getCurrentPosition(), qui fonctionne pour IOS et navigateur mais pas pour Android.

  • utilisation de la solution fiddle fournie par cette question getCurrentPosition() et watchPosition () sont dépréciées sur les origines incertaines

de toute façon , tous ces éléments sont deprecated par google à cause :-

getCurrentPosition () et watchPosition () sont dépréciées sur unsafe les origines et le soutien seront supprimés à l'avenir. Vous devriez envisagez de changer votre application à une origine sûre, comme HTTPS. Voir goo.gl / rStTGz pour plus de détails.

le problème avec joshmorony(https://www.joshmorony.com/adding-background-geolocation-to-an-ionic-2-application/) solution is foreground ne fonctionne pas pour les appareils physiques Android, mais fonctionne très bien pour le navigateur et ios. Le suivi de fond fonctionne bien, ce qui prend près de 50 secondes pour donner lat & lng pour la première fois.

Merci de m'aider avec cela. Je veux un moyen d'obtenir l'emplacement actuel en un minimum de temps. Pour votre info, Je suis en utilisant google javascript carte sdk / api .

14
demandé sur kumar kundan 2017-09-07 14:00:55

5 réponses

j'ai parcouru le problème et trouver la solution.

la meilleure façon d'obtenir de la géolocalisation de l'utilisateur est de l'utilisation de ce plugin https://ionicframework.com/docs/native/geolocation/

n'oubliez pas d'ajouter ceci est app.moudle.ts comme son fournisseur.

en ajoutant simplement ce code dans le composant app j'ai pu obtenir l'emplacement ( n'oubliez pas d'importer et d'ajouter dans constructor)

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

je ne ont la même erreur pendant que j'utilisais ionique cordova exécuter android -- livereload c'est l'insécurité origine

mais lorsque j'utilise ionique servir je peux voir la réponse dans le navigateur et aussi après en utilisant ionique cordova exécuter android

juste pour confirmer la réponse dans android je vérifie le débogueur chrome.

1
répondu amyogiji 2017-09-07 18:33:40

j'ai essayé toutes les solutions fournies par vous et d'autres aussi sur internet. J'ai finalement trouvé une solution.Vous pouvez essayer ce plugin cordova-plugin-avancé-la géolocalisation (https://github.com/Esri/cordova-plugin-advanced-geolocation ) ESRI . Mais ce plugin fonctionnera pour Android IOS. Pour ios, vous pouvez suivre la même approche. j'.e - utilisation de this.geolocation.getCurrentPosition(...) ou this.geolocation.watchPosition(..).

Ajouter un Plugin comme celui-ci :-

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

declare var AdvancedGeolocation:any; //dans le haut de la classe

//**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;
            });

          });
        }
1
répondu kumar kundan 2017-12-07 05:38:08

j'ai rencontré un problème similaire. Quand je construis à partir du terminal avec le drapeau --prod, Je ne vois plus cette erreur puisqu'elle demande maintenant la position sur https.

Construit sans --prod drapeau

Construit en utilisant le drapeau --prod

Edit: Désolé pour le format, j'espère que cela fait un peu plus de sens. J'ai utilisé la fonction suivante dans un service que je pouvais appeler de n'importe où pour obtenir la latitude, la longitude, l'exactitude, et timestamp. La clé cependant est d'utiliser le drapeau -- prod dans le terminal lors de la construction de l'application.

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
répondu Justin B 2018-07-17 05:44:52

vous devez fournir l'autorisation pour l'application Android comme suit:

<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" />
-1
répondu Webruster 2017-09-19 09:22:14

j'ai trouvé la solution pour moi: utilisez l'api google https://www.googleapis.com/geolocation/v1/geolocate?key={API_KEY} Si plate-forme Android j'utilise Google api.

-2
répondu wstudiokiwi 2017-10-23 14:08:52