Cordova / Phonegap地理位置插件管理错误

时间:2015-07-23 10:08:12

标签: javascript android cordova geolocation phonegap-plugins

我正在写一个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)...为什么?如何以严谨的方式使用它?

1 个答案:

答案 0 :(得分:0)

我发现地理错误的处理是特定于平台的。由于设置enableHighAccuracy: true会导致您的应用程序要求操作系统使用GPS硬件检索位置,因此在Android设备上关闭GPS的效果会因Android版本而异:操作系统永远无法检测到准确度位置,因此发生TIMEOUT错误(Android上不会收到PERMISSION_DENIED)或使用Wifi / cell tr​​iangulation检索并传递低精度位置。

我建议使用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();