地理定位总是超时在cordova应用程序



我正在开发Sencha Touch(2.3.1)应用程序,使用Cordova 3.5.0-0.2.7进行打包。我试图读取GPS坐标使用:

navigator.geolocation.getCurrentPosition()

但是请求总是在Android手机上超时,而它在Chrome模拟器中工作良好。我也试过使用watchPosition()。

如果你还没有,安装cordova-plugin-geolocation到你的项目-即cordova plugin add cordova-plugin-geolocation -这将添加适当的权限到你的Android清单,正如Mike Dailor正确指出的那样,你需要。

作为第三个参数传递给getCurrentPosition()的是什么选项?geolocationOptions对象有3个属性:timeout, maxAge和enableHighAccuracy。

假设你想要一个准确的位置(即GPS跟踪/卫星导航类型的应用程序),设置enableHighAccuracy: true会导致你的应用程序要求操作系统使用GPS硬件检索位置。在这种情况下,您希望设置一个超时值,该超时值允许GPS硬件有足够的时间第一次获得修复,否则超时将在它有机会获得修复之前发生。

还请记住,在Android设备上关闭GPS的效果(例如将设置位置模式更改为"节省电池")取决于Android版本:操作系统永远无法检索高精度位置,因此发生TIMEOUT错误(PERMISSION_DENIED将不会在Android上被接收)或低精度位置将被检索并通过而不是使用Wifi/cell三角测量。

我建议使用watchPosition()而不是getCurrentPosition()来检索位置;getCurrentPosition()对当前时间点的设备位置发出单个请求,因此位置超时可能发生在设备上的GPS硬件有机会获得位置修复之前,而使用watchPosition()可以设置一个监视器,每当操作系统接收到来自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 (err.code == 3 // TIMEOUT
        && watchpositionErrorCount >= MAX_POSITION_ERRORS_BEFORE_RESET) {        
        clearWatch();
        addWatch();
        watchpositionErrorCount = 0;
    }
}
addWatch();

一直在与这个问题作斗争,直到我发现这个插件=> https://github.com/louisbl/cordova-plugin-locationservices.

插件的存在主要是因为cordova地理定位插件不再使用Android代码:https://issues.apache.org/jira/browse/CB-5977。它依赖于WebView的地理定位功能。不知道为什么没人谈论这个。

下面是我的代码片段:

<>之前美元的范围。getcoordinates = function() {

       if (window.cordova) {
        var PRIORITY_BALANCED_POWER_ACCURACY = 102;
        var posOptions = { maximumAge: 1000, timeout: 20000,enableHighAccuracy: false, priority: PRIORITY_BALANCED_POWER_ACCURACY };
        cordova.plugins.locationServices.geolocation.getCurrentPosition(function(position) {
             if(Location.init(position.coords.latitude,position.coords.longitude)){
               $scope.Data.latitude = position.coords.latitude;
               $scope.Data.longitude = position.coords.longitude;
               //Toast.show('Getting Location...', 'short', 'top');
               }else{
                $scope.Data.latitude = '';
                $scope.Data.longitude = '';
                Toast.show('Turn on Location access in settings for better sales tracking..', 'short', 'bottom');
              }
            console.log(position);
          }, function(error) {
            $scope.Data.latitude = '';
            $scope.Data.longitude = '';
            Toast.show('Error encountered with Geolocation Api', 'short', 'bottom');
            console.log(error);
          }, posOptions);
        }
     }

我有同样的问题,并通过这样做找到解决方案:

  1. 添加插件白名单:ionic plugin Add https://github.com/apache/cordova-plugin-whitelist.git

我猜这个问题与权限有关,白名单解决了这个问题。

相关内容

  • 没有找到相关文章

最新更新