我正在开发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);
}
}
我有同样的问题,并通过这样做找到解决方案:
-
添加插件白名单:ionic plugin Add https://github.com/apache/cordova-plugin-whitelist.git
我猜这个问题与权限有关,白名单解决了这个问题。