不要将此问题标记为重复,stackoverflow上的任何答案都不适合我。其中很多是针对Ionic 1或者那些答案已被弃用或者它们不适用于Android设备。
我已经在stackoverflow上看到很多关于获取设备当前位置的解决方案,但是没有解决方案似乎适用于Android。
我试过的: -
geolocation.getCurrentPosition()
,它适用于IOS和浏览器,但不适用于Android。this.geolocation.watchPosition()
,它适用于IOS和浏览器,但不适用于Android。navigator.geolocation.getCurrentPosition()
,它适用于IOS和浏览器,但不适用于Android。无论如何,所有这些都被谷歌弃用,原因是: -
getCurrentPosition()和watchPosition()在不安全的起源上被弃用,将来会删除支持。您应该考虑将应用程序切换到安全的来源,例如HTTPS。有关详细信息,请参阅goo.gl/rStTGz。
background-geolocation plugin
但是,它在Android设备上花了将近50-55秒,再次它对ios工作正常joshmorony(https://www.joshmorony.com/adding-background-geolocation-to-an-ionic-2-application/)解决方案的问题是前景不适用于Android物理设备,但适用于浏览器和ios。背景跟踪工作正常,这是第一次花费将近50秒的时间来进行拉动。
请帮我解决一下这个。我想要一种在最短时间内获得当前位置的方法。对于您的信息,我使用谷歌javascript地图sdk / api。
我尝试了所有人和其他人在互联网上提供的所有解决方案。最后我找到了一个解决方案。您可以尝试从ESRI获得此插件cordova-plugin-advanced-geolocation(https://github.com/Esri/cordova-plugin-advanced-geolocation)。但是这个插件适用于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;
});
});
}
编辑:首次安装总是很好。但有时您可能会在后续安装中无缘无故地收到错误。要使此错误(此插件的任何错误)消失。请按照以下步骤操作:
1.从项目中删除此插件(包括config.xml
和package.json
)。
2.删除/删除android
平台。
3.删除plugins
文件夹。
4.现在按照上述步骤再次重新安装此插件。
我已经解决了问题并找到了解决方案。
获取用户地理位置的最佳方法是使用此插件https://ionicframework.com/docs/native/geolocation/
不要忘记添加这个app.module.ts作为它的提供者。
只需在app组件中添加此代码,我就可以获取位置(不要忘记导入并添加构造函数)
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中的响应我检查了chrome调试器。
我遇到了类似的问题。当我使用--prod标志从终端构建时,我不再看到此错误,因为它现在通过https请求位置。
编辑:抱歉格式,我希望这更有意义。我在一个服务中使用了以下功能,我可以从任何地方调用以获取纬度,经度,准确度和时间戳。关键是在构建应用程序时在终端中使用--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);
})
这个方法适用于机器人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);
});
}
您需要提供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" />
我找到了解决方案:使用google api https://www.googleapis.com/geolocation/v1/geolocate?key={API_KEY}
如果平台Android我使用google api。