所有Android浏览器中的JavaScript Geolocation都失败了 - 在iOS和PC上工作

时间:2013-08-07 15:10:39

标签: javascript android geolocation

这是我的基本代码:

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 X上我得到错误代码:Timeout。此外,GPS在此设备上也能正常工作。

7 个答案:

答案 0 :(得分:7)

您必须使用HTTPS

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

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

答案 1 :(得分: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 false。当页面脚本请求位置时,浏览器将在android设备浏览器中询问用户权限。可能是你点击过,从不分享你的位置。请通过清除设备中的浏览器设置进行检查。我保证android 2.3+中没有geolocation api问题而不会弄乱安全设置。

如果问题仍然存在,并且您想要添加至少一些polyfill,请检查此https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills并祝你好运。他们根据您的IP使用geoIP database计算位置。

答案 2 :(得分: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');
        }

    };

答案 3 :(得分:1)

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

我很惊讶Chrome在移动设备上禁用了此功能。

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

答案 4 :(得分:0)

我还有一个关于HTML5中的地理位置API的项目。我测试了中兴V880(ROM CM7 2.3),中兴V980 ROM 4.0,华为P6 ROM4.2,三星Galaxy Note I(ROM 2.3,ROM 4.1),发现在某些设备上可以解决定位服务问题。但无法在Galaxy Note I上使用Rom2.3,wifi&全球定位系统。

但有些设备可以在使用Opera浏览器时跟踪位置,如中兴V980 ROM4.0

答案 5 :(得分: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();
}

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

答案 6 :(得分:0)

我也有同样的问题,我通过设置dialog.show(); loadVendorsListFromFirebaseDB(dialog, bookingType); 解决了这个问题。 enableHighAccuracy: false设置为enableHighAccuracy

时,某些设备不支持GEO位置