我正在写一个Cordova / Phonegap应用,我使用Geolocation插件......这是我的代码...
var onSuccess = function(position) {
longitude = position.coords.longitude;
latitude = position.coords.latitude;
console.log("Latitude: "+position.coords.latitude);
console.log("Longitude: "+position.coords.longitude);
};
function onError(error) {
logService.debug("Code: "+error.code);
logService.debug("Message: "+error.message);
};
navigator.geolocation.getCurrentPosition(onSuccess, onError, { maximumAge: 3000, timeout: 15000, enableHighAccuracy: true });
现在,我在浏览器上测试它,当我没有获得权限时,我会收到错误代码1(PositionError.PERMISSION_DENIED),当我执行权限时,它在浏览器上工作得很好......现在出生了问题。 ..当我在设备上测试它并且GPS关闭时,我没有收到错误代码1(PositionError.PERMISSION_DENIED)但是总是收到超时...这样我就不会发现差异了...... 。我将超时设置为150000,但我总是收到代码3(PositionError.TIMEOUT)...为什么?如何以严谨的方式使用它?
答案 0 :(得分:0)
我发现地理错误的处理是特定于平台的。由于设置enableHighAccuracy: true
会导致您的应用程序要求操作系统使用GPS硬件检索位置,因此在Android设备上关闭GPS的效果会因Android版本而异:操作系统永远无法检测到准确度位置,因此发生TIMEOUT错误(Android上不会收到PERMISSION_DENIED)或使用Wifi / cell triangulation检索并传递低精度位置。
我建议使用watchPosition()
代替getCurrentPosition()
来检索位置; getCurrentPosition()在当前时间点对设备位置发出单个请求,因此位置超时可能在设备上的GPS硬件有机会获得定位之前发生,而使用watchPosition()
则可以设置观察者,每当OS从GPS硬件接收位置更新时,该观察者将调用成功函数。如果您只想要一个位置,请在收到足够精确的位置后清除观察者。如果在添加观察程序时Android设备上的GPS已关闭,它将继续返回TIMEOUT错误;我的解决方法是在发生一些遗留错误后清除并重新添加观察者。
所以尝试这些方法:
var MAX_POSITION_ERRORS_BEFORE_RESET = 3,
MIN_ACCURACY_IN_METRES = 20,
positionWatchId = null,
watchpositionErrorCount = 0,
options = {
maximumAge: 60000,
timeout: 15000,
enableHighAccuracy: true
};
function addWatch(){
positionWatchId = navigator.geolocation.watchPosition(onWatchPositionSuccess, onWatchPositionError, options);
}
function clearWatch(){
navigator.geolocation.clearWatch(positionWatchId);
}
function onWatchPositionSuccess(position) {
watchpositionErrorCount = 0;
// Reject if accuracy is not sufficient
if(position.coords.accuracy > MIN_ACCURACY_IN_METRES){
return;
}
// If only single position is required, clear watcher
clearWatch();
// Do something with position
var lat = position.coords.latitude,
lon = position.coords.longitude;
}
function onWatchPositionError(err) {
watchpositionErrorCount++;
if (watchpositionErrorCount >= MAX_POSITION_ERRORS_BEFORE_RESET) {
clearWatch();
addWatch();
watchpositionErrorCount = 0;
}
}
addWatch();