2012-11-14 83 views
5

我創建了一個專爲智能手機設計的網站(可訪問http://dev.gkr33.com),並試圖使用navigator.geolocation api並通過getCurrentPosition獲取您的位置。這似乎起初工作,但是如果你嘗試刷新頁面,它總是會帶回上一次的GPS位置。我在頁面上添加了一些調試信息,該信息抓取getCurrentPosition返回的時間,並在初始定位後始終返回相同的時間(下降到毫秒)。navigator.geolocation getCurrentPosition在Chrome Mobile中未更新

這似乎只在Chrome移動設備上發生的。如果我通過股票Android瀏覽器瀏覽網站,它每次都能正常工作。

的代碼如下所示;

<script type="text/javascript"> 
    (function ($) { 
    $(document).ready(function() { 
     var options = { enableHighAccuracy: true, maximumAge: 0, timeout: 60000 }; 
     var position; 

     // empty the current html elements, not strictly necessary but 
     // I'm clutching at straws 
     $('#debug-latlng').empty(); 
     $('#debug-time').empty(); 
     $('#debug-address').empty(); 

     // Let's try and find out where we are 
     if(navigator.geolocation) { 
      navigator.geolocation.getCurrentPosition(gotPos, gotErr, options); 
     } else { 
      gotErr(); 
     } 

     // We've got our position, let's show map and update user 
     function gotPos(position) { 
      var info; 
      info = position.coords.latitude+','+position.coords.longitude; 
      $('#debug-latlng').text(info); 
      $('#debug-time').text(parseTimestamp(position.timestamp)); 

      // the following json call will translate the longitude and 
      // latitude into an address (a wrapper for google's geocode call) 

      $.getJSON('http://dev.gkr33.com/api.php', { req: "getLocationInfo", latlng: $('#debug-latlng').text() }, function(json) { 
       $('#debug-address').text(json['results'][0]['formatted_address']); 
      }); 

      var myLatLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); 
      var mapOptions = { 
        zoom: 12, 
        center: myLatLng, 
        mapTypeId: google.maps.MapTypeId.ROADMAP 
      };  
      var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); 

      var marker = new google.maps.Marker({ 
       position: myLatLng, 
       title: 'You are here', 
       animation: google.maps.Animation.DROP 
      }); 
      marker.setMap(map); 
     } //gotPos 


     // Trap a GPS error, log it to console and display on site 
     function gotErr(error) { 
      var errors = { 
        1: 'Permission denied', 
        2: 'Position unavailable', 
        3: 'Request timeout' 
       }; 
      console.log("Error: " + errors[error.code]); 
      $('#debug-latlng').text('GPS position not available'); 
     } //gotErr 

     // Make timestamp human readable 
     function parseTimestamp(timestamp) { 
      var d = new Date(timestamp); 
      var day = d.getDate(); 
      var month = d.getMonth() + 1; 
      var year = d.getFullYear(); 
      var hour = d.getHours(); 
      var mins = d.getMinutes(); 
      var secs = d.getSeconds(); 
      var msec = d.getMilliseconds(); 
      return day + "." + month + "." + year + " " + hour + ":" + mins + ":" + secs + "," + msec; 
     } // parseTimestamp  
    });   
}) (jQuery); 
</script> 

我玩過maximumAge和timeout的各種值,但似乎沒有影響相同的position.coords和position.time值。

我認爲Chrome Mobile可能存在問題,但我不想在這個時候假設太多,只需要澄清一下,我沒有在代碼中犯過類似muppet的比例錯誤。

任何非常感謝幫助您可以提供。

更新:我想我應該說,我在兩個Android設備測試這一點; HTC One X +和三星Galaxy Tab 7.7,結果相同。在兩個股票瀏覽器工作正常,並在兩個Chrome不刷新位置。將測試上的Apple設備後:)

回答

7

我從來沒有對這個問題的底部,但我利用watchPosition呼叫,並清除watchID前5秒的等待這個包裹了解決該問題的方法。檢查下面的代碼:

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

我還沒有和「選項」值或此刻的超時時間玩耍了,但上面的代碼帶回每一個平臺,我嘗試了準確的定位信息。

希望這可以幫助別人有同樣的問題:)

1

我終於找到了Firefox的工作版本,鉻在android系統&默認的導航器(4.2只測試):

function getGeoLocation() { 
     var options = null; 
     if (navigator.geolocation) { 
      if (browserChrome) //set this var looking for Chrome un user-agent header 
       options={enableHighAccuracy: false, maximumAge: 15000, timeout: 30000}; 
      else 
       options={maximumAge:Infinity, timeout:0}; 
      navigator.geolocation.getCurrentPosition(getGeoLocationCallback, 
        getGeoLocationErrorCallback, 
        options); 
     } 
    }