Геолокация JavaScript на Android не работает
Я занимаюсь разработкой веб-сайта, который опирается на данные геолокации мобильного пользователя. Я делаю это типичным способом через:
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);
}
Это всегда завершается ошибкой с [object PositionError] в функции errorOnLocate, даже если я переключаю порядок методов геолокации.
Это на HTC Hero с android 2.1 с использованием любого встроенного браузера. Мой gps включен, и я дал указание браузеру разрешить веб-сайтам просматривать мое местоположение. Функция "местоположение" на родном приложении карты Google, которое приходит на телефон, точно определяет мое местоположение
Более того, если я захожу на мой сайт с помощью FireFox 3.5 на моем персональном компьютере, он будет правильно определять мое местоположение (я думаю, что он использует комбинацию точек данных ip и ap). В любом случае, он использует тот же JavaScript.
РЕДАКТИРОВАТЬ: это HTML / JS в браузере, а не нативное приложение. Также точное сообщение об ошибке: "Последний поставщик местоположения был отключен"
4 ответа
К этому обращаются из WebView
или из приложения Android Browser? Если из WebView
Вам может потребоваться включить геолокацию через вызов Java. См. Ссылку WebView для этого.
В противном случае, я не уверен точно, что не так с вашим JS, но вот HTML+JS, который я знаю, работает с браузером Android:
<!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>
Это не работало на моем Android 2.4, проблема была решена путем включения местоположения беспроводных сетей помимо GPS (не работал только с GPS)
Настройки -> Местоположение и конфиденциальность -> Включить беспроводные сети.
Я проверил функциональность геолокации html5 на следующих двух телефонах:
- HTC Wildfire
- HTC Galaxy
Оба работали под управлением ОС Android 2.1 update1, и оба не смогли выполнить геолокацию, используя встроенный браузер Google и такие демонстрационные сайты, как:
Тем не менее, я разработал свое собственное приложение (используя комбинацию кода, уже представленного выше), которое успешно работает на:
- HTC Wildfire
- Эмулятор Android 2.1 update1
- еще не тестировали HTC Galaxy
и код, который я использую:
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(); }
}
Фактический код в моем HTML-файле:
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'; }
Извините, этот исходный код просто не хочет форматировать должным образом, напишите мне, и я вышлю вам код, если вы того пожелаете.
У меня была эта проблема, и я думаю, что это было, потому что питание на устройстве было низким. Зарядил его, и проблема ушла.