地理定位总是在cordova app中超时

时间:2015-08-07 12:02:34

标签: cordova google-maps geolocation timeout sencha-touch

我正在使用Cordova 3.5.0-0.2.7打包的Sencha Touch(2.3.1)应用程序。我正在尝试使用以下方式读取GPS坐标:

navigator.geolocation.getCurrentPosition()

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

如果您还没有,请在项目中安装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错误(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 (err.code == 3 // TIMEOUT
        && watchpositionErrorCount >= MAX_POSITION_ERRORS_BEFORE_RESET) {        
        clearWatch();
        addWatch();
        watchpositionErrorCount = 0;
    }

}
addWatch();

答案 1 :(得分:1)

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

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

以下是我的代码片段:

 $scope.getCordinates= 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);
        }

     }

答案 2 :(得分:0)

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

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

  2. 每次更改依赖项时都不要忘记安装npm。

  3. 我猜这个问题是以某种方式与权限相关,白名单解决了它。

    祝你好运!