尝试获取位置时“权限被拒绝”

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)

“go.tools”的权限被拒绝错误

在 vba 中获取 iframe 的 Contentwindow - 访问被拒绝/权限被拒绝

访问被拒绝:获取云端硬盘凭据时权限被拒绝

AWS Lambda 返回权限被拒绝尝试从 S3 存储桶获取对象

挂载文件时获取权限被拒绝错误