安卓上的JavaScript地理定位无法正常工作

10

我正在开发一个依赖于获取移动用户地理位置数据的网站。我正在使用典型的方式进行:

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);
}
无论我如何更改位置方法的顺序,在 errorOnLocate 函数中始终会失败并显示 [object PositionError] 错误。这是在使用内置浏览器的 Android 2.1 的 HTC Hero 上。我的 GPS 处于开启状态,我已经指示浏览器允许网站查看我的位置。该手机自带的谷歌地图应用程序的“位置”功能可以很好地找到我的位置。此外,如果我在个人电脑上使用 Firefox 3.5 访问我的网站,则它将正确地找到我的位置(我认为它使用 ip 和 ap 数据点的组合)。无论如何,它都使用相同的 JavaScript。编辑:这是在浏览器中使用 HTML/JS,而不是原生应用程序。此外,确切的错误消息是“最后一个位置提供程序已禁用”。
4个回答

12

这是从WebView还是从Android浏览器应用程序访问的?如果来自WebView,则您可能需要通过Java调用启用地理位置。请参见WebView参考文献

否则,我不确定您的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>

1
嗯,谢谢回复。这是一种不同的方法,但行为很奇怪。它需要超过2分钟才能找到位置,一旦找到位置,它仅显示坐标约5秒钟,然后最终显示“错误”。 - Dan.StackOverflow
1
我在上面的代码中添加了选项,它仍然可以正常工作,但需要超过2分钟才能获取位置,至少不会出错。关键是启用enableHighAccuracy标志,没有这个标志,每次都会出错。你知道有没有更专业的论坛可以提出这个问题,因为如果需要2分钟才能锁定位置,这个项目就无法继续进行了。 - Dan.StackOverflow
2
奇怪,我的 Nexus One 几乎立即得到了响应。也许这是设备的问题而不是代码的问题?我会尝试使用模拟器并通过 DDMS 发送模拟位置数据来测试。 - Roman Nurik

1

这在我的Android 2.4上无法工作,问题是通过启用无线网络位置(仅使用GPS无法工作)来解决的。

设置 -> 位置和隐私 -> 启用无线网络。


0

我已经使用以下两部手机测试了HTML5地理位置功能:

  • HTC Wildfire
  • HTC Galaxy

两台手机都运行着Android 2.1 update1操作系统,但在使用内置的Google浏览器和演示网站进行地理定位时均失败了:

然而,我已经开发了自己的应用程序(使用上面已经介绍的代码的组合),成功地运行在以下设备上:

  • HTC Wildfire
  • Android 2.1 update1 模拟器
  • 还没有测试过 HTC Galaxy

我正在使用的代码是:

Javascript库: ``` 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(){};
// 尝试使用HTML5规范的地理位置服务。 var geolocation = navigator.geolocation;
if (geolocation) { // 我们有一个真正的地理位置服务。 try { function handleSuccess(position) { successCallback(position.coords); }
geolocation.watchPosition(handleSuccess, errorCallback, { enableHighAccuracy: true, maximumAge: 5000 // 5秒。 }); } catch (err) { errorCallback(); } } else { errorCallback(); } }
// 在我的HTML文件中的实际代码: if (is_browser_gps_capable()) { $('geo_location').innerHTML = '正在定位设备...'; 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 = '不支持'; }); } else { $('geo_location').innerHTML = '不支持'; } ```

抱歉,这段源代码无法正确格式化,请给我发消息,如果您愿意的话,我会直接将代码发送给您。


0
我遇到了这个问题,我认为是因为设备的电量不足。充电后,问题就解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接