2012-11-14 6 views
5

Ich habe eine Website erstellt (erreichbar unter http://dev.gkr33.com), die für ein Smartphone entworfen wurde und versucht, die navigator.geolocation api zu verwenden und Ihre Position über getCurrentPosition zu erfassen. Dies scheint zunächst zu funktionieren, wenn Sie jedoch versuchen, die Seite zu aktualisieren, bringt es immer die letzte GPS-Position zurück. Ich habe einige Debug-Informationen auf der Seite hinzugefügt, die den Zeitpunkt der getCurrentPosition-Rückgabe abrufen und nach der anfänglichen Positionierung immer die gleiche Zeit (bis auf die Millisekunde) zurückgibt.navigator.geolocation getCurrentPosition wird nicht in Chrome Mobile aktualisiert

Dies scheint nur in Chrome Mobile passieren. Wenn ich über den Android-Browser in die Site blicke, funktioniert es jedes Mal einwandfrei.

Der Code ist unten gezeigt;

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

Ich habe um mit verschiedenen Werten für die maximumAge und Timeout, gespielt, aber nichts scheint die gleichen position.coords und position.time Werte zu beeinflussen.

Ich denke, es gibt vielleicht ein Problem mit Chrome Mobile, aber ich möchte jetzt nicht zu viel annehmen und brauche nur die Klarstellung, dass ich in meinem Code keinen Fehler von muppetartigen Proportionen gemacht habe.

Vielen Dank für Ihre Hilfe.

UPDATE: Ich denke, ich hätte sagen sollen, dass ich das auf zwei Android-Geräten getestet habe; HTC One X + und ein Samsung Galaxy Tab 7.7 mit dem gleichen Ergebnis. Auf beiden Seiten funktioniert der Browser gut und auf beiden Seiten wird die Position nicht aktualisiert. Will später auf einem Apple-Gerät testen :)

Antwort

7

Ich kam nie auf das Ende dieses Problems, aber ich habe einen Weg um das Problem durch die Verwendung der watchPosition Anruf, und das Einwickeln in 5 Sekunden warten, bevor Sie die watchID löschen. Überprüfen Sie den Code unten:

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

Ich habe nicht um den „Optionen“ Werte oder die Timeout-Zeit im Moment, aber die oben genannten Code bringt wieder eine genaue Positionierung Informationen auf jeder Plattform Ich habe versucht gespielt.

Hoffnung hilft dies jemand mit dem gleichen Problem :)

1

ich endlich eine funktionierende Version für Firefox, Chrome & Standard Navigator in Android (4.2 nur getestet) gefunden:

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