离子2 /离子3:如何获得设备的当前位置

不要把这个问题重复标记为重复, stackoverflow上的答案都不适用于我。 他们很多是离子1或这些答案已弃用,或他们不工作的Android设备。

我已经看到了很多关于获取设备当前位置的stackoverflow解决scheme,但他们似乎并没有为Android的工作。

我曾试过: –

  • 使用geolocation.getCurrentPosition() ,它适用于IOS浏览器,但不适用于Android

  • 使用this.geolocation.watchPosition() ,它适用于IOS浏览器,但不适用于Android

  • 使用navigator.geolocation.getCurrentPosition() ,它适用于IOS浏览器,但不适用于Android

  • 使用这个问题提供的小提琴解决schemegetCurrentPosition()和watchPosition()在不安全的起源

无论如何,所有这些都被谷歌弃用 ,由于: –

getCurrentPosition()和watchPosition()在不安全的来源上被弃用,并且将来将会删除支持。 您应该考虑将您的应用程序切换到安全的来源,例如HTTPS。 有关更多详细信息,请参阅goo.gl/rStTGz。

  • 什么对我来说是( https://ionicframework.com/docs/native/background-geolocation/)&(https://www.joshmorony.com/adding-background-geolocation-to-an-ionic-2-application / )这两个都是基于background-geolocation plugin但它需要几乎50-55秒的Android设备,再次它工作正常的IOS

joshmorony ( https://www.joshmorony.com/adding-background-geolocation-to-an-ionic-2-application/ )解决scheme的问题是前台不适用于Android物理设备,但对浏览器和ios工作正常。 后台跟踪工作正常,这是第一次花费近50秒才能给出lat&lng。

请帮我解决一下这个。 我想要一种在最短时间内获得当前位置的方法。 为了您的信息,我使用谷歌JavaScript地图SDK / API。

Solutions Collecting From Web of "离子2 /离子3:如何获得设备的当前位置"

我尝试了互联网上的所有人和其他人提供的每个解决scheme。 最后我find了一个解决scheme。你可以从ESRI试试这个插件cordova-plugin-advanced-geolocationhttps://github.com/Esri/cordova-plugin-advanced-geolocation )。 但是这个插件将适用于Android而不是IOS 。 对于ios,你可以用同样的旧方法去。 即 – 使用this.geolocation.getCurrentPosition(...)this.geolocation.watchPosition(..)

添加插件像这样: –

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

我已经经历了这个问题,find了解决办法。

获取用户的地理位置的最好方法是使用这个插件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); }) 

我只有同样的错误,而我使用离子cordova运行android –livereload ,这是不安全的起源

但是当我使用离子服务,我可以看到在浏览器中的反应,也使用离子cordova运行android后

只是为了确认在Android的响应我检查铬debugging器。

您需要提供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" /> 

我find了我的解决scheme:使用谷歌API https://www.googleapis.com/geolocation/v1/geolocate?key={API_KEY}如果平台Android我使用谷歌API。