7

这是我非常基本的代码:

if (navigator.geolocation) {

     // WILL GET TO THIS POINT WITH TEST `ALERT()`  

      navigator.geolocation.getCurrentPosition(

     // WILL NOT GET OT THIS POINT IN ANDROID BROWSER

     function(position) {
        var latitude = position.coords.latitude;
        var longitude = position.coords.longitude;
      }, showError, {
        enableHighAccuracy: true,
        timeout : 5000,
        maximumAge: 0
       }
       );
    } else {
        return alert('No Geolocation Support.');
    }
};

它在 iOS(Safari 和 Chrome)中运行良好;以及我尝试过的所有 PC 浏览器。

在 Android 上,我尝试过现有的 HTC 浏览器、Chrome 和 Dolphin。卫星看起来像是在搜索,然后它停止了。我什至不记得它要求我允许使用地理定位(可能忽略了那部分)

更新:它确实适用于我的 Nexus 10 Chrome 浏览器。但不是我的 HTC One X。

更新 2 - 这似乎只发生在一台 Android 设备上,即 AT&T HTC One X。所有其他 Android 设备、PC 浏览器和 iOS 都可以正常工作。在 One XI 上得到错误代码:超时。此外,GPS 在此设备上也可以正常工作。

4

7 回答 7

7

您必须使用 HTTPS

从 Chrome 50 开始,Chrome 不再支持使用 HTML5 Geolocation API 从非安全连接传递的页面中获取用户的位置。这意味着进行 Geolocation API 调用的页面必须从安全上下文(例如 HTTPS)提供服务。

https://developers.google.com/web/updates/2016/04/geolocation-on-secure-contexts-only?hl=en

于 2016-08-24T11:45:12.223 回答
6

你的代码是绝对正确的。I have tested this in Android 2.3 + to latest version in different devices including HTC, Samsung, Asus tablets and Samsung tablets. 即使在平板电脑中,它也能正常工作。检查设备是否有share location falsein device 的设置。当页面脚本请求位置浏览器时,将在 android 设备浏览器中请求用户许可。可能是您点击了从不分享您的位置。请通过清除设备中的浏览器设置进行检查。我保证在 android 2.3+ 中没有地理定位 api 问题,而不会弄乱安全设置。

如果问题仍然存在并且你想添加至少一些 polyfill 然后检查这个https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills并有一些运气。他们根据您的 IP 使用情况计算位置geoIP database

于 2013-08-19T17:52:07.500 回答
2

在寻找相同问题的解决方案后,得出的结论是,android 设备的超时需要设置得更高,我实现了以下作为基础:



    function setGeoLocation(){

    var ua = navigator.userAgent.toLowerCase(),
        isAndroid = ua.indexOf("android") > -1,
        geoTimeout = isAndroid ? '15000' : '1000';

        function success (position) {
            console.log(position);
        };

        function error (err) {
            console.log('error message');
        }

        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(success, error, {enableHighAccuracy: true, maximumAge: 3000, timeout:geoTimeout});
        } else {
            error('Location services must be enabled to use this');
        }

    };

于 2014-02-12T12:55:37.470 回答
1

我遇到了与网站没有通信的程序同样的问题。它有一个获取代码的 URL,但在加载 HTML 页面和 .js 文件后,它不与主机通信。这个程序已经运行了几年,只是停止了工作。问题是新版本的 Chrome 禁用了 navigator.geolocation.getCurrentPosition() 函数。我更改了站点以允许 SSL 访问,程序现在像以前一样工作。

我真的很惊讶 Chrome 在移动设备上禁用了这个功能。

另一种解决方法是使用 firefox 作为浏览器。

于 2016-05-03T17:46:53.857 回答
0

我还有一个关于 HTML5 中的地理定位 API 的项目。我测试了ZTE V880(ROM CM7 2.3),ZTE V980 ROM 4.0, Huawei P6 ROM4.2, Samgsung Galaxy Note I (ROM 2.3,ROM 4.1),发现定位服务可以在某些设备上解决。但不能在 Galaxy Note I 上使用 Rom2.3、wifi 和 gps。

但是有些设备在使用Opera浏览器时可以定位,比如ZTE V980 ROM4.0

于 2013-09-06T00:58:03.473 回答
0

试试这个:到 watchPosition 调用,并在清除 watchID 之前等待 5 秒。代码如下;

var options = { enableHighAccuracy: true, maximumAge: 100, timeout: 60000 };
if( navigator.geolocation) {
   var watchID = navigator.geolocation.watchPosition( gotPos, gotErr, options );
   var timeout = setTimeout( function() { navigator.geolocation.clearWatch( watchID ); }, 5000 );
} else {
   gotErr();
}

目前我还没有玩过“选项”值或超时延迟,但上面的代码在我尝试过的每个平台上都带回了准确的定位信息。

于 2014-06-22T05:36:42.570 回答
0

我也有同样的问题,我通过设置解决了enableHighAccuracy: falseenableHighAccuracy设置为时,某些设备不支持 GEO 位置true

于 2017-12-15T05:45:14.163 回答