在我的ionic / angularjs应用程序中我正在使用地理位置插件:https://github.com/apache/cordova-plugin-geolocation
在文档中,我使用它来配置手表:
var watchOptions = {
frequency : 10*1000,
timeout : 60*60*1000,
enableHighAccuracy: true // may cause errors if true
};
watch = navigator.geolocation.watchPosition(on_success,on_error,watchOptions);
但是在Android上,频率远高于10秒(约0.5秒)。在iOS上它很棒。这有什么问题?
答案 0 :(得分:17)
根据以下评论更新
frequency
的{{3}}中没有watchPosition()
参数,因此您传递的任何值都将被忽略。每次本机位置管理器从GPS硬件接收位置更新时(在watchPosition()
的情况下),都会调用通过enableHighAccuracy=true
注册的成功回调,因此不会在固定的时间间隔内调用它。
本机位置管理器(Android和iOS)都是事件驱动的,即当它以非固定间隔传送时,它们会从GPS硬件接收更新。因此,尝试将固定频率应用于此是试图在圆孔中安装方形钉 - 您不能要求GPS硬件在N秒内为您提供位置更新。
虽然您可以按固定时间间隔调用getCurrentPosition()
,但此方法只会返回上次收到的位置或请求新位置。
如果问题是更新太频繁,您可以记录每次更新的时间,并且只接受N秒后的下一次更新,例如
var lastUpdateTime,
minFrequency = 10*1000,
watchOptions = {
timeout : 60*60*1000,
maxAge: 0,
enableHighAccuracy: true
};
function on_success(position){
var now = new Date();
if(lastUpdateTime && now.getTime() - lastUpdateTime.getTime() < minFrequency){
console.log("Ignoring position update");
return;
}
lastUpdateTime = now;
// do something with position
}
navigator.geolocation.watchPosition(on_success,on_error,watchOptions);
然而,这不会停止设备更频繁地请求更新,因此消耗相对大量的电池。
原生Android geolocation options允许您在请求位置时指定更新之间的最短时间,以便最大限度地减少电池消耗,但Android上的LocationManager并未实现直接使用LocationManager,但而是使用原生webview中的cordova-plugin-geolocation,这不允许您指定它。
但是,您可以使用此插件执行此操作:W3C Geolocation API Specification
它允许您指定:
interval:设置活动位置更新的所需间隔,以毫秒为单位。
fastInterval:明确设置位置更新的最快间隔,以毫秒为单位。