Android 上的 JavaScript 地理定位不起作用

发布于 2024-09-12 05:58:53 字数 886 浏览 11 评论 0原文

我正在开发一个依赖于提取移动用户的地理位置数据的网站。我通过以下典型方式进行操作:

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,而不是本机应用程序。另外,确切的错误消息是“最后一个位置提供程序已被禁用”

I am developing a website that relies on pulling the geolocation data of a mobile user. I am doing it the typical way via:

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);
}

This always fails with [object PositionError] in to the errorOnLocate function, even if I switch the geolocation method order.

This is on an HTC Hero with android 2.1 using whatever browser is built in. My gps is on and I have instructed the browser to allow websites to view my location. The "location" feature on the google map native application that comes on the phone picks up my location just fine

Further more if I visit my site using FireFox 3.5 on my personal computer it will find my location correctly.(I believe it uses a combination of ip and ap data points). Either way, it uses the same javascript.

EDIT: This is html/js in a browser, not a native app. Also the exact error message is 'The last location provider was disabled'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

心是晴朗的。 2024-09-19 05:58:54

我遇到了这个问题,我认为这是因为设备电量低。给它充电,问题就消失了。

I was having this problem and I think it was because the power on the device was low. Charged it up and the problem went away.

空心↖ 2024-09-19 05:58:53

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

否则,我不确定你的 JS 到底出了什么问题,但这是我知道适用于 Android 浏览器的 HTML+JS:

<!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>

Is this being accessed from a WebView or from the Android Browser app? If from a WebView, you may need to enable geolocation via a Java call. See the WebView reference for that.

Otherwise, I'm not sure precisely what's wrong with your JS, but here's HTML+JS that I know works with the Android browser:

<!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>
生死何惧 2024-09-19 05:58:53

这在我的 Android 2.4 上不起作用,通过启用 GPS 之外的无线网络位置(不能仅使用 GPS)解决了问题

。地点及地点隐私->启用无线网络。

This wasn't working on my Android 2.4, the problem was solved by enabling Wireless Networks Location besides GPS (wasn't working with just GPS)

Settings -> Location & Privacy -> Enable Wireless Networks.

猫九 2024-09-19 05:58:53

我已经使用以下两款手机测试了 html5 地理定位功能:

  • HTC Wildfire
  • HTC Galaxy

两者都运行 Android 2.1 update1 操作系统,并且都无法使用内置 Google 浏览器和演示网站(例如:

但是,我开发了自己的应用程序(使用上面已提供的代码的组合),该应用程序成功运行在:

  • HTC Wildfire
  • Android 2.1 update1 模拟器
  • 上尚未测试 HTC Galaxy

,我使用的代码是:

  1. Javascript lib:

    函数 is_browser_gps_capable() {
        var _locator_object;
        尝试 {
            _locator_object = navigator.geolocation;
        } catch (e) { 返回 false; }
        如果(_定位器_对象)
            返回真;
        别的
            返回假;
    }

    函数 watchLocation(successCallback, errorCallback) { 成功回调 = 成功回调 ||功能(){}; 错误回调 = 错误回调 ||功能(){};

    // 尝试 HTML5 规范地理定位。
    var geolocation = navigator.geolocation;
    
    如果(地理位置){
        // 我们有真正的地理定位服务。
        尝试 {
          函数处理成功(位置){
            successCallback(position.coords);
          }
    
          geolocation.watchPosition(handleSuccess, errorCallback, {
            启用高精度:true,
            maxAge: 5000 // 5 秒
          });
        } 捕获(错误){
          错误回调();
        }
      } 别的 {
        错误回调();
      }
    

    }

  2. 我的 html 文件中的实际代码:

    if (is_browser_gps_capable()) {
        $('geo_location').innerHTML = '正在定位设备...';
        手表位置(函数(坐标){
              var latlng = new google.maps.LatLng(coords.latitude, coords.longitude);
              var myOptions = {
                变焦:16,
                中心:拉丁语,
                地图类型 ID:google.maps.MapTypeId.ROADMAP
              };
              var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
              var 标记 = 新 google.maps.Marker({
                  位置:经纬度, 
                  地图: 地图,
              });
    $('geo_location').innerHTML = coords.latitude + ',' + coords.longitude; }, 功能() { $('geo_location').innerHTML = '不支持'; }); } 别的 { $('geo_location').innerHTML = '不支持'; }

抱歉,这个源代码只是不想正确格式化,请给我发消息,如果您愿意,我会直接向您发送代码。

I have tested html5 geolocation functionality with the following two phones:

  • HTC Wildfire
  • HTC Galaxy

Both were running the Android 2.1 update1 OS and both failed to do geolocation using the built in Google browser and demo sites like:

However, I have developed my own app (using a combination of the code already presented above) that successfully runs on:

  • HTC Wildfire
  • Android 2.1 update1 emulator
  • have not had HTC Galaxy yet to test

and the code I am using is:

  1. Javascript lib:

    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();
      }
    

    }

  2. actual code in my html file:

    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'; }

Sorry this source code just does not want to format properly, message me and i'll send you the code directly if you wish so.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文