我正在开发一个应用程序来定期(不仅是第一次)跟踪我的手机,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米)。似乎这两种情况之一出现了:
设备无法从GPS传感器获得位置(精确度),但它通过AGPS(来自3g单元)获得,导致返回相同的位置和精度。 GPS传感器显然已打开,我在清单文件中设置了正确的权限:
getCurrentPosition()
设备在调用“getCurrentPosition”后正确获得第一个位置,但下次调用此方法时,位置从某个“GPS缓存”返回,并且该位置实际上并非来自GPS传感器。
有没有人通过{{1}} HTML5 Javascript方法定期更新位置?
答案 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