我正在使用Cordova 3.5.0-0.2.7打包的Sencha Touch(2.3.1)应用程序。我正在尝试使用以下方式读取GPS坐标:
navigator.geolocation.getCurrentPosition()
但该请求总是在Android手机上超时,而它在Chrome模拟器中运行良好。我也尝试过使用watchPosition()。
非常感谢任何帮助。
答案 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 triangulation检索并传递低精度位置。
我建议使用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)
我遇到了同样的问题并通过这样做找到了解决方案:
添加插件白名单:离子插件添加https://github.com/apache/cordova-plugin-whitelist.git
每次更改依赖项时都不要忘记安装npm。
我猜这个问题是以某种方式与权限相关,白名单解决了它。
祝你好运!