如何定期更新WebView中的HTML5位置(使用FINE_ACCURACY)

时间:2011-12-18 13:55:38

标签: android html5 webview geolocation

我正在开发一个应用程序来定期(不仅是第一次)跟踪我的手机navigator.geolocation.getCurrentPosition()在运行于android中的webkit webview中运行的HTML5页面中运行navigator.geolocation.getCurrentPosition() 2.1申请。

我已阅读以下问题的回复:

Using navigator.geolocation.getCurrentPosition in WebView on Android 2.0+ (PhoneGap related)
Android: Using html5 to determine geolocation in webview with javascript api
Geolocation cannot be load on webview
Android WebView using GeolocationPermissions

我设法通过javascript方法getCurrentPosition()获得了这个位置,即使准确度非常差(1421米)。

但真正的问题是:如果我不止一次调用<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_GPS" /> <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" /> <uses-permission android:name="android.permission.ACCESS_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 方法,它会让我始终保持相同的位置并始终具有相同的不准确度(1421米)。似乎这两种情况之一出现了:

  1. 设备无法从GPS传感器获得位置(精确度),但它通过AGPS(来自3g单元)获得,导致返回相同的位置和精度。 GPS传感器显然已打开,我在清单文件中设置了正确的权限:

    getCurrentPosition()
  2. 设备在调用“getCurrentPosition”后正确获得第一个位置,但下次调用此方法时,位置从某个“GPS缓存”返回,并且该位置实际上并非来自GPS传感器。

  3. 有没有人通过{{1}} HTML5 Javascript方法定期更新位置?

1 个答案:

答案 0 :(得分:2)

我发现手机(至少使用iPhone)通常需要三次检查才能获得准确的读数,几乎就像他们正在对位置进行三角测量一样。正如您所发现的那样,问题是每次对getCurrentPosition()的新呼叫似乎都是“盲目”,因此它不会更准确(当您在台式机/笔记本电脑上运行此功能时,结果会有所不同)。

解决方案是geolocation.watchPosition()。该功能使用先前的调用来提高准确性。大约五秒钟之后,它就像它将要获得的那样准确(如果你没有移动),所以你停止检查。此外,它会在它认为不会更准确的任何时候停止检查。使用window.setTimeout()来控制间隔。

演示:http://jsfiddle.net/ThinkingStiff/yn3Bq/

HTML:

<div id="result"></div>

脚本:

var latitude, longitude, accuracy;

function setGeolocation() {
    var geolocation = window.navigator.geolocation.watchPosition( 
        function ( position ) {
            latitude = position.coords.latitude;
            longitude = position.coords.longitude;
            accuracy = position.coords.accuracy;
            document.getElementById( 'result' ).innerHTML += 
                  'lat: ' + latitude + ', '
                + 'lng: ' + longitude + ', '
                + 'accuracy: ' + accuracy + '<br />';
        }, function () { 
            /*error*/ 
        }, {
            maximumAge: 250, 
            enableHighAccuracy: true
        } 
    );
    window.setTimeout( function () {
            window.navigator.geolocation.clearWatch( geolocation ) 
        }, 
        5000 //stop checking after 5 seconds
    );
};

setGeolocation();

window.setTimeout( function () {
        setGeolocation();
    }, 
    30000 //check every 30 seconds
);

输出:

lat:35.5830119,lng:-124.4871223,准确度:40
   lat:35.5829974,lng:-124.4871525,准确度:30