尝试获取位置时“权限被拒绝”
Posted
技术标签:
【中文标题】尝试获取位置时“权限被拒绝”【英文标题】:"Permission Denied" when trying to fetch location 【发布时间】:2012-04-08 20:33:57 【问题描述】:当我尝试使用此代码获取我的位置时,我一直收到“权限被拒绝”:
function initialize()
$('.map-fullsize').hide();
$('#weather-map').hide();
$('#weather-data').hide();
if(geo_position_js.init())
var waiting_time = $('#getting-position').html('Försöker att hitta din aktuella position. Var god vänta...');
t = setTimeout(function()
waiting_time.html('Det tar längre tid att hitta din position, än vad det egentligen borde göra.<br><br><b>Tips</b><br>GPS-mottagaren har lättare att hitta dig om du är utomhus. Täta moln som till exempel vid ett åskoväder, kan göra det svårare för satelliterna att hämta din position.');
, 60000);
geo_position_js.getCurrentPosition(show_position, function()
clearTimeout(t);
$('#getting-position').html('<b>Ett fel uppstod</b><br>Din position kunde inte hittas. Se till att vara utomhus för bästa möjliga resultat och försök igen.');
,
enableHighAccuracy: true
);
else
$('#getting-position').html('<b>Ett fel uppstod</b><br>Det verkar som att din webbläsare inte tillåter GPS-positionering.');
function show_position(p)
$('.map-fullsize').show();
$('#weather-map').show();
$('#weather-data').show();
$('#getting-position').hide();
if(navigator.geolocation)
navigator.geolocation.getCurrentPosition(showError, function(position)
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
var accuracy = position.coords.accuracy;
var speed = position.coords.speed;
var altitude = position.coords.altitude;
var heading = position.coords.heading;
var coords = new google.maps.LatLng(latitude, longitude);
var mapOptions =
center: coords,
streetViewControl: false,
mapTypeControl: true,
navigationControlOptions:
style: google.maps.NavigationControlStyle.SMALL
,
zoomControl: true,
zoomControlOptions:
style: google.maps.ZoomControlStyle.SMALL,
position: google.maps.ControlPosition.TOP_LEFT
,
mapTypeId: google.maps.MapTypeId.ROADMAP
;
map = new google.maps.Map(
document.getElementById('weather-map'), mapOptions
);
var marker = new google.maps.Marker(
position: coords,
map: map
);
var circle = new google.maps.Circle(
center: coords,
radius: accuracy,
map: map,
fillColor: '#3333ff',
fillOpacity: 0.4,
strokeColor: '#3333ff',
strokeOpacity: 0.8,
strokeWeight: 1
);
map.setCenter(coords);
if(accuracy > 30)
map.fitBounds(circle.getBounds());
else
map.setZoom(14);
$('#weather-data').load('jquery-fetch/fetch-weatherdata.php?coor=' + latitude.toFixed(6).replace(/\./, '') + ',' + longitude.toFixed(6).replace(/\./, '') + '&coordinates=' + latitude.toFixed(6) + ',' + longitude.toFixed(6) + '&accuracy=' + accuracy + '&speed=' + speed + '&altitude=' + altitude + '&heading=' + heading);
);
else
alert('Geolocation API stöds inte i din webbläsare');
function showError(error)
switch(error.code)
case error.PERMISSION_DENIED:
$('.map-fullsize').hide();
$('#weather-map').hide();
$('#weather-data').hide();
$('#permission-denied').show();
break;
case error.POSITION_UNAVAILABLE:
$('.map-fullsize').hide();
$('#weather-map').hide();
$('#weather-data').hide();
$('#position-unavailable').show();
break;
case error.TIMEOUT:
$('.map-fullsize').hide();
$('#weather-map').hide();
$('#weather-data').hide();
$('#timeout').show();
break;
case error.UNKNOWN_ERROR:
$('.map-fullsize').hide();
$('#weather-map').hide();
$('#weather-data').hide();
$('#unknown-error').show();
break;
$(document).ready(function()
initialize();
);
我找不到此代码有任何问题,有趣的是,代码在我收到“权限被拒绝”之前获取了我的 GPS 位置。这个问题是my previous question 的“后续”。我该如何解决我的问题?
提前致谢。
【问题讨论】:
navigator.geolocation 是浏览器的一部分,而不是 Maps API。你怎么知道它在获取你的位置信息? 哦。行。我阅读了一份指南并遵循了它,因此我展示的代码的“基线”看起来和它一样。我真的不能说它是在检测我的确切位置,还是因为错误消息而只是在地址栏中显示 GPS 图标 :) 浏览器是否真的被允许访问您设备上的 GPS?这是特定于设备的设置。 是的,我知道 :) 我只是不知道为什么我总是收到“权限被拒绝”。如果我删除showError
函数,地图和位置将出现在几乎每次重新加载的页面上 - 有时地图和位置不会出现,有时会出现
【参考方案1】:
你正在使用
navigator.geolocation.getCurrentPosition(showError, function(position) ...)
getCurrentPosition 的specification 以其他顺序显示函数。这样做的原因是只有成功回调是强制性的;它必须是第一位的。如果提供了第二个参数,则它是错误回调。第三个参数是一个选项对象。
【讨论】:
啊!我已将showError
移至第 92 行,现在一切正常:) 再次感谢!【参考方案2】:
只有两件事;
i) 为了测试这一点,我稍微简化了您的代码,修复了一些小问题并删除了对 geo.js 的依赖。
ii) 仅当网站托管在外部 http:// 服务器上时,地理位置才有效
<html>
<body>
<div id='map' class='map-fullsize'></div>
<div id='weather-map'></div>
<div id='weather-data'></div>
<div id='getting-position'></div>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type='text/javascript'>
function initialize()
$('.map-fullsize').hide();
$('#weather-map').hide();
$('#weather-data').hide();
var waiting_time = $('#getting-position').html('Försöker att hitta din aktuella position. Var god vänta...');
get_position();
t = setTimeout(function ()
$('#getting-position').html('Det tar längre tid att hitta din position, än vad det egentligen borde göra.<br><br><b>Tips</b><br>GPS-mottagaren har lättare att hitta dig om du är utomhus. Täta moln som till exempel vid ett åskoväder, kan göra det svårare för satelliterna att hämta din position.');
, 60000);
function get_position()
$('#getting-position').html("get_position()");
$('.map-fullsize').show();
$('#weather-map').show();
$('#weather-data').show();
// $('#getting-position').hide();
if(navigator.geolocation)
$('#getting-position').html("navigator.geolocation");
navigator.geolocation.getCurrentPosition(showPosition, showError, enableHighAccuracy: true );
else
alert('Geolocation API stöds inte i din webbläsare');
function showPosition(position)
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
var accuracy = position.coords.accuracy;
var speed = position.coords.speed;
var altitude = position.coords.altitude;
var heading = position.coords.heading;
$('#getting-position').html(
"have position" +
" latitude = " + latitude.toString() +
" longitude = " + longitude.toString()
);
/* Add marker to Google maps etc... */
function showError(error)
switch(error.code)
case error.PERMISSION_DENIED:
$('.map-fullsize').hide();
$('#weather-map').hide();
$('#weather-data').hide();
$('#permission-denied').show();
break;
case error.POSITION_UNAVAILABLE:
$('.map-fullsize').hide();
$('#weather-map').hide();
$('#weather-data').hide();
$('#position-unavailable').show();
break;
case error.TIMEOUT:
$('.map-fullsize').hide();
$('#weather-map').hide();
$('#weather-data').hide();
$('#timeout').show();
break;
case error.UNKNOWN_ERROR:
$('.map-fullsize').hide();
$('#weather-map').hide();
$('#weather-data').hide();
$('#unknown-error').show();
break;
$(document).ready(function()
initialize();
);
</script>
</body>
</html>
【讨论】:
以上是关于尝试获取位置时“权限被拒绝”的主要内容,如果未能解决你的问题,请参考以下文章
小程序----选择地理位置 ( wx.chooseLocation ) 和 获取地理位置 (wx.getSetting)
在 vba 中获取 iframe 的 Contentwindow - 访问被拒绝/权限被拒绝