科尔多瓦应用程序中的地理位置总是超时

Posted

技术标签:

【中文标题】科尔多瓦应用程序中的地理位置总是超时【英文标题】:Geolocation always timing out in cordova app 【发布时间】:2015-08-07 12:02:34 【问题描述】:

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

navigator.geolocation.getCurrentPosition()

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

任何帮助将不胜感激。

【问题讨论】:

你设置了什么超时值? 您是否在 config.xml 中设置了适当的 Android 权限? @GaëlMarziou 我为设备使用了长达 1 分钟的值,而在模拟器中尝试时响应会在几秒钟内出现。是的,我尝试授予这些权限,但也没有运气。 问题是在构建应用程序时权限被覆盖。使用在构建时添加权限的插件解决了这个问题。 【参考方案1】:

如果您还没有安装 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 三角测量。

我建议使用 watchPosition() 而不是 getCurrentPosition() 来检索位置; getCurrentPosition() 在当前时间点对设备位置发出单个请求,因此在设备上的 GPS 硬件有机会获得定位之前可能会发生位置超时,而使用 watchPosition() 可以设置每次操作系统从 GPS 硬件接收到位置更新时都会调用成功函数的 watcher。如果您只想要一个位置,请在收到足够准确的位置后清除观察者。如果在添加watcher时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();

【讨论】:

感谢戴夫的提示。问题是在构建应用程序时权限被覆盖了。使用在构建时添加权限的插件解决了这个问题。另外,由于我使用的是 Cordova 连同这个插件,在AndroidManifest.xml中手动添加 @DaveAlden:先生,我已经尝试过上面的代码,但出现位置错误,告诉我先生为什么?【参考方案2】:

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

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

这是我的代码的 sn-p:

$scope.getCordinates=函数()
       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);
        

     

【讨论】:

是的。试一试,它不会让你失望的。【参考方案3】:

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

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

    不要忘记在每次更改依赖项时执行一次 npm 安装。

我猜这个问题是通过权限实现的,白名单解决了它。

祝你好运!

【讨论】:

以上是关于科尔多瓦应用程序中的地理位置总是超时的主要内容,如果未能解决你的问题,请参考以下文章

地理位置科尔多瓦应用程序中的位置半径

设置请求地理位置科尔多瓦

地理定位不适用于科尔多瓦

如何更改 Ionic 2 iOS 应用程序的位置访问描述?我正在为我的应用程序使用科尔多瓦地理定位插件

如何在科尔多瓦上删除 ios 地理定位身份验证请求消息

科尔多瓦的地理位置