Cordova geolocation watchPosition频率高于选项允许它

时间:2016-02-09 14:08:36

标签: android angularjs cordova geolocation

在我的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上它很棒。这有什么问题?

1 个答案:

答案 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:明确设置位置更新的最快间隔,以毫秒为单位。