2012-11-14 28 views
5

Tôi đã tạo một trang web (có thể truy cập tại http://dev.gkr33.com) được thiết kế cho điện thoại thông minh và cố gắng sử dụng api navigator.geolocation và lấy vị trí của bạn qua getCurrentPosition. Điều này dường như làm việc ban đầu, tuy nhiên nếu bạn cố gắng làm mới trang nó luôn luôn mang lại vị trí GPS cuối cùng. Tôi đã thêm một số thông tin gỡ lỗi trên trang mà lấy thời gian của sự trở lại getCurrentPosition và sau khi định vị ban đầu nó luôn luôn trả về cùng một thời gian (xuống đến mili giây).navigator.geolocation getCurrentPosition không cập nhật trong Chrome Mobile

Điều này dường như chỉ xảy ra trong Chrome Mobile. Nếu tôi duyệt qua các trang web thông qua trình duyệt Android chứng khoán nó hoạt động tốt mọi lúc.

Mã được hiển thị bên dưới;

<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> 

Tôi đã phát xung quanh với các giá trị khác nhau cho giá trị cực đại và thời gian chờ, nhưng dường như không ảnh hưởng đến cùng giá trị vị trí và giá trị vị trí.

Tôi nghĩ có thể có vấn đề với Chrome Mobile, nhưng tôi không muốn giả sử quá nhiều vào thời điểm này và chỉ cần làm rõ rằng tôi đã không mắc sai lầm về tỷ lệ muppet trong mã của tôi.

Rất cám ơn vì bất kỳ trợ giúp nào bạn có thể cung cấp.

CẬP NHẬT: Tôi cho rằng tôi nên nói rằng tôi đã thử nghiệm điều này trên hai thiết bị Android; HTC One X + và Samsung Galaxy Tab 7.7 có cùng kết quả. Trên cả trình duyệt chứng khoán hoạt động tốt và cả Chrome đều không làm mới vị trí. Sẽ thử nghiệm trên Thiết bị Apple sau :)

Trả lời

7

Tôi chưa bao giờ gặp vấn đề này, nhưng tôi đã giải quyết vấn đề bằng cách sử dụng cuộc gọi watchPosition và đợi trong 5 giây trước khi xóa watchID. Kiểm tra mã dưới đây:

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(); 
} 

Tôi đã không chơi xung quanh với "Tùy chọn" giá trị hoặc sự chậm trễ thời gian chờ vào lúc này, nhưng mã trên mang lại thông tin định vị chính xác trên mọi nền tảng tôi đã cố gắng.

Hy vọng điều này sẽ giúp người với cùng một vấn đề :)

1

cuối cùng tôi đã tìm thấy một phiên bản làm việc cho firefox, chrome navigator & mặc định trong Android (4.2 chỉ được thử nghiệm):

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); 
     } 
    }