views:

321

answers:

2

I am developing a website that relies on pulling the geolocation data of a mobile user. I am doing it the typical way via:

function initialize() {
   if(window.google && google.gears) {
        var geo = google.gears.factory.create('beta.geolocation');
        geo.getCurrentPosition(useLocation, errorOnLocate);
   }
   else if(navigator.geolocation) {
       navigator.geolocation.getCurrentPosition(useLocation, errorOnLocate);
   }
   else {
       alert("no geo found");
   }
}

function errorOnLocate(message)
{
    alert(message);
    zoomTo(-34.397, 150.644);
}

This always fails with [object PositionError] in to the errorOnLocate function, even if I switch the geolocation method order.

This is on an HTC Hero with android 2.1 using whatever browser is built in. My gps is on and I have instructed the browser to allow websites to view my location. The "location" feature on the google map native application that comes on the phone picks up my location just fine

Further more if I visit my site using FireFox 3.5 on my personal computer it will find my location correctly.(I believe it uses a combination of ip and ap data points). Either way, it uses the same javascript.

EDIT: This is html/js in a browser, not a native app. Also the exact error message is 'The last location provider was disabled'

+1  A: 

Is this being accessed from a WebView or from the Android Browser app? If from a WebView, you may need to enable geolocation via a Java call. See the WebView reference for that.

Otherwise, I'm not sure precisely what's wrong with your JS, but here's HTML+JS that I know works with the Android browser:

<!DOCTYPE html> 
<html> 
<head> 
  <script type="text/javascript"> 
function watchLocation(successCallback, errorCallback) {
  successCallback = successCallback || function(){};
  errorCallback = errorCallback || function(){};

  // Try HTML5-spec geolocation.
  var geolocation = navigator.geolocation;

  if (geolocation) {
    // We have a real geolocation service.
    try {
      function handleSuccess(position) {
        successCallback(position.coords);
      }

      geolocation.watchPosition(handleSuccess, errorCallback, {
        enableHighAccuracy: true,
        maximumAge: 5000 // 5 sec.
      });
    } catch (err) {
      errorCallback();
    }
  } else {
    errorCallback();
  }
}

function init() {
  watchLocation(function(coords) {
    document.getElementById('test').innerHTML = 'coords: ' + coords.latitude + ',' + coords.longitude;
  }, function() {
    document.getElementById('test').innerHTML = 'error';
  });
}
  </script> 
</head> 

<body onload="init()"> 
  <div id="test">Loading...</div> 
</body> 
</html>
Roman Nurik
Hmm, Thanks for the reply. This is a different approach but the behavior is bizarre. It takes over 2 minutes for it to find a location, and once it does it only displays the coordinates for about 5 seconds, and then finally just displays "error".
Dan.StackOverflow
I added the Options to my code above and it works just the same, takes over 2 minutes to get a location, but it's not erroring at least. Key is the enableHighAccuracy flag, without the flag it errors everytime. Do you know of a more specialized forum to take this inquiry to, because at 2 minutes to get a lock this project is dead in the water.
Dan.StackOverflow
Odd, I get a response almost immediately on my Nexus One. Perhaps it's an issue with the device and not the code? I'd try this with an emulator and sending it mock location data via DDMS.
Roman Nurik
+1. Good answer. I can't believe nobody else voted you up.
David Stratton
A: 

I have tested html5 geolocation functionality with the following two phones:

  • HTC Wildfire
  • HTC Galaxy

Both were running the Android 2.1 update1 OS and both failed to do geolocation using the built in Google browser and demo sites like:

However, I have developed my own app (using a combination of the code already presented above) that successfully runs on:

  • HTC Wildfire
  • Android 2.1 update1 emulator
  • have not had HTC Galaxy yet to test

and the code I am using is:

  1. Javascript lib:

    function is_browser_gps_capable() { var _locator_object; try { _locator_object = navigator.geolocation; } catch (e) { return false; } if (_locator_object) return true; else return false; }

    function watchLocation(successCallback, errorCallback) { successCallback = successCallback || function(){}; errorCallback = errorCallback || function(){};

    // Try HTML5-spec geolocation.
    var geolocation = navigator.geolocation;
    
    
    if (geolocation) {
        // We have a real geolocation service.
        try {
          function handleSuccess(position) {
            successCallback(position.coords);
          }
    
    
    
      geolocation.watchPosition(handleSuccess, errorCallback, {
        enableHighAccuracy: true,
        maximumAge: 5000 // 5 sec.
      });
    } catch (err) {
      errorCallback();
    }
    
    } else { errorCallback(); }

    }

  2. actual code in my html file:

    if (is_browser_gps_capable()) { $('geo_location').innerHTML = 'Locating device...'; watchLocation(function(coords) { var latlng = new google.maps.LatLng(coords.latitude, coords.longitude); var myOptions = { zoom: 16, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); var marker = new google.maps.Marker({ position: latlng, map: map, });
    $('geo_location').innerHTML = coords.latitude + ',' + coords.longitude; }, function() { $('geo_location').innerHTML = 'Not supported'; }); } else { $('geo_location').innerHTML = 'Not supported'; }

Sorry this source code just does not want to format properly, message me and i'll send you the code directly if you wish so.

Rok