这是我的基本代码:
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在此设备上也能正常工作。
答案 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