android上的javascript地理定位不';行不通
我正在开发一个网站,它依赖于移动用户的地理位置数据。我是通过以下方式进行这项工作的:android上的javascript地理定位不';行不通,javascript,android,geolocation,htc-hero,Javascript,Android,Geolocation,Htc Hero,我正在开发一个网站,它依赖于移动用户的地理位置数据。我是通过以下方式进行这项工作的: function initialize() { if(window.google && google.gears) { var geo = google.gears.factory.create('beta.geolocation'); geo.getCurrentPosition(useLocation, errorOnLocate); } e
function initialize() {
if(window.google && google.gears) {
var geo = google.gears.factory.create('beta.geolocation');
geo.getCurrentPosition(useLocation, errorOnLocate);
}
else if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(useLocation, errorOnLocate);
}
else {
alert("no geo found");
}
}
function errorOnLocate(message)
{
alert(message);
zoomTo(-34.397, 150.644);
}
如果[object PositionError]进入errorOnLocate函数,即使我切换了地理定位方法顺序,也会失败
这是在HTC Hero上的,android 2.1使用内置的任何浏览器。我的gps已打开,我已指示浏览器允许网站查看我的位置。手机上谷歌地图原生应用程序的“位置”功能可以很好地识别我的位置
此外,如果我在个人电脑上使用Firefox3.5访问我的网站,它会正确地找到我的位置。(我相信它结合使用了ip和ap数据点)。无论哪种方式,它都使用相同的javascript
编辑:这是浏览器中的html/js,不是本机应用程序。另外,确切的错误消息是“上次位置提供程序被禁用”这是从
网络视图访问的还是从Android浏览器应用程序访问的?如果从WebView
,您可能需要通过Java调用启用地理定位。看看这个
否则,我不确定你的JS到底出了什么问题,但我知道有一个HTML+JS可以与Android浏览器一起使用:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function watchLocation(successCallback, errorCallback) {
successCallback = successCallback || function(){};
errorCallback = errorCallback || function(){};
// Try HTML5-spec geolocation.
var geolocation = navigator.geolocation;
if (geolocation) {
// We have a real geolocation service.
try {
function handleSuccess(position) {
successCallback(position.coords);
}
geolocation.watchPosition(handleSuccess, errorCallback, {
enableHighAccuracy: true,
maximumAge: 5000 // 5 sec.
});
} catch (err) {
errorCallback();
}
} else {
errorCallback();
}
}
function init() {
watchLocation(function(coords) {
document.getElementById('test').innerHTML = 'coords: ' + coords.latitude + ',' + coords.longitude;
}, function() {
document.getElementById('test').innerHTML = 'error';
});
}
</script>
</head>
<body onload="init()">
<div id="test">Loading...</div>
</body>
</html>
函数watchLocation(successCallback,errorCallback){
successCallback=successCallback | | function(){};
errorCallback=errorCallback | |函数(){};
//试试HTML5规范的地理定位。
var geolocation=navigator.geolocation;
if(地理定位){
//我们有真正的地理定位服务。
试一试{
功能手柄成功(位置){
成功回调(position.coords);
}
地理位置。监视位置(handleSuccess、errorCallback、{
EnableHighAccurance:正确,
最大值:5000//5秒。
});
}捕捉(错误){
errorCallback();
}
}否则{
errorCallback();
}
}
函数init(){
值班位置(功能(协调){
document.getElementById('test').innerHTML='coords:'+coords.latitude+','+coords.longitude;
},函数(){
document.getElementById('test')。innerHTML='error';
});
}
加载。。。
我已经用以下两款手机测试了html5地理定位功能:
- HTC野火
- HTC银河
两人都在运行Android 2.1 update1操作系统,但都未能使用内置的谷歌浏览器和演示网站进行地理定位,如:
但是,我已经开发了自己的应用程序(使用上述代码的组合),该应用程序成功运行于:
- HTC野火
- Android 2.1更新1仿真器
- 还没有HTC Galaxy进行测试
我使用的代码是:
Javascript库:
}
我的html文件中的实际代码:
如果(是否支持浏览器\u gps\u()){
$('geo_location')。innerHTML='locing device…';
值班位置(功能(协调){
var latlng=新的google.maps.latlng(坐标系纬度,坐标系经度);
变量myOptions={
缩放:16,
中心:拉特林,
mapTypeId:google.maps.mapTypeId.ROADMAP
};
var map=new google.maps.map(document.getElementById(“map_canvas”),myOptions);
var marker=new google.maps.marker({
位置:latlng,
地图:地图,
});
$('geo_location')。innerHTML=coords.latitude+,'+coords.longitude;
},函数(){
$('geo_location')。innerHTML='notsupported';
});
}否则{
$('geo_location')。innerHTML='notsupported';
}
很抱歉,此源代码格式不正确,请给我发消息,如果您愿意,我会直接将代码发送给您。这在我的Android 2.4上不起作用,通过启用GPS以外的无线网络定位解决了此问题(仅GPS不起作用)
设置->位置和隐私->启用无线网络 我遇到了这个问题,我想这是因为设备的电源太低了。充电后,问题就消失了。嗯,谢谢你的回复。这是一种不同的方法,但其行为很奇怪。它需要2分钟才能找到一个位置,一旦找到,它只会显示大约5秒钟的坐标,然后最后只显示“错误”。我在上面的代码中添加了选项,它的工作原理是一样的,需要2分钟才能找到一个位置,但至少没有错误。键是EnableHighAccurance标志,没有每次出错的标志。你知道有哪个更专业的论坛可以把这个问题带到哪里去吗?因为在2分钟内,这个项目就完蛋了。奇怪的是,我的NexusOne几乎立刻得到了回复。也许是设备的问题,而不是代码的问题?我会用一个模拟器来尝试,并通过DDMS发送模拟位置数据。
function is_browser_gps_capable() {
var _locator_object;
try {
_locator_object = navigator.geolocation;
} catch (e) { return false; }
if (_locator_object)
return true;
else
return false;
}
function watchLocation(successCallback, errorCallback) {
successCallback = successCallback || function(){};
errorCallback = errorCallback || function(){};
// Try HTML5-spec geolocation.
var geolocation = navigator.geolocation;
if (geolocation) {
// We have a real geolocation service.
try {
function handleSuccess(position) {
successCallback(position.coords);
}
geolocation.watchPosition(handleSuccess, errorCallback, {
enableHighAccuracy: true,
maximumAge: 5000 // 5 sec.
});
} catch (err) {
errorCallback();
}
} else {
errorCallback();
}
if (is_browser_gps_capable()) {
$('geo_location').innerHTML = 'Locating device...';
watchLocation(function(coords) {
var latlng = new google.maps.LatLng(coords.latitude, coords.longitude);
var myOptions = {
zoom: 16,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
var marker = new google.maps.Marker({
position: latlng,
map: map,
});
$('geo_location').innerHTML = coords.latitude + ',' + coords.longitude;
}, function() {
$('geo_location').innerHTML = 'Not supported';
});
} else {
$('geo_location').innerHTML = 'Not supported';
}