Ответ 1
Мне удалось разобраться... Однако я понятия не имею, что на самом деле решило. Все, что я сделал, это изменить одну из моих моделей. Может ли кто-нибудь увидеть соединение с геолокацией?
Я использую sencha-touch 2.0 и phonegap 2.0.0 в своем приложении, чтобы получить местоположение пользователя. При работе на моем locahost все работает просто отлично. Тем не менее, при загрузке .apk на мое устройство android 15 api (с использованием eclipse и плагина adt) каждый вызов getCurrentLocation или watchPosition никогда не возвращается...
вот мой код:
geoOn: function(){
var geoReady = navigator.geolocation || undefined;
var onSuccess = function(position){
Top5.app.alert('Geolocation success '+String(position.coords.latitude) + ' ' + String(position.coords.longitude),'Geolocation');
var scope = Ext.getCmp('nestedList');
scope.updateDistance(position.coords);
};
var onFailure = function(error){Top5.app.alert('Geolocation failed: '+String(error.code) + ' '+String(error.message),'Geolocation');};
if (geoReady) {
this.watchId = navigator.geolocation.watchPosition(onSuccess ,onFailure,{timeout:6000,maximumAge: 3000,enableHighAccuracy: true});
}
else{
Ext.device.Geolocation.watchPosition({
frequency: 3000, // Update every 3 seconds
callback: function(position) {
this.updateDistance(position.coords);
},
failure: function() {
console.log('Geolocation Failure!');
},
scope:this
});
}
},
geoGet: function(){
var geoReady = navigator.geolocation || undefined;
if (geoReady) {
var onSuccess = function(position){
Top5.app.alert('Geolocation successful!!!');
var scope = Ext.getCmp('nestedList');
scope.updateDistance(position.coords);
};
var onFailure = function(error){Top5.app.alert('Geolocation failed: '+String(error.code) + ' '+String(error.message),'Geolocation');};
navigator.geolocation.getCurrentPosition(onSuccess,onFailure);
}
else{}
},
geoOff:function(){
var geoReady = navigator.geolocation || undefined;
if (geoReady) {
navigator.geolocation.clearWatch(this.watchId);
this.watchId = null;
}
else{
Ext.device.Geolocation.clearWatch();
}
},
updateDistance:function(coords){
Top5.app.alert('updateDist','');
var scope = Ext.getCmp('nestedList');
var lat = coords.latitude,lon = coords.longitude;
var store = scope.getStore();
var i,record;
for(i = 0; i < store.data.all.length; i++)
{
record = store.data.all[i];
if(record.data.locationX){
record.set('distance',Top5.app.getDistance(record.data.locationX,record.data.locationY,lat,lon).toFixed(3));
}
}
}
ОБНОВЛЕНИЕ: Итак, я вышел из своего здания, и это сработало... мне нужно чаще выходить на улицу.
Тем не менее, когда я отключил gps, я думал, что geoLocation найдет мое местоположение, используя wifi-соединение, но оно не удается (я устанавливаю enableHighAccuracy: false). Почему это?
ОБНОВЛЕНИЕ: Никто? О.К. позвольте мне перефразировать мой вопрос: Предполагается ли navigator.geolocation.watchPosition работать как с сигналом GPS, так и с сигналами wifi/g3? Как определить местоположение пользователя, используя только подключение к Интернету? в настоящее время мой код работает только с GPS, и когда эта опция отключена или сигнал заблокирован, геолокация не работает..... ПОМОЩЬ ПОЖАЛУЙСТА!
Мне удалось разобраться... Однако я понятия не имею, что на самом деле решило. Все, что я сделал, это изменить одну из моих моделей. Может ли кто-нибудь увидеть соединение с геолокацией?
Я знаю, что, может быть, уже слишком поздно, но сегодня я боролся с той же проблемой! Решение оказалось очень простым!
РЕШЕНИЕ: Перезагрузите устройство.
Это все.
Проблема в том, что вы никогда не знаете, когда пользователь получит такую ошибку, поэтому, если ваше приложение сильно зависит от геолокации, я рекомендую вам установить тайм-аут в параметрах местоположения navigator.geolocation.getCurrentPosition(geoSuccess, geoError, {timeout: 15000})
и предупредить пользователя о проблеме и возможном решении.
P.S. Имейте в виду, что Geolocation может отключиться, например, если мобильные данные также отключены, поэтому перезагрузка не всегда будет исправлена. На iPhone он использует сотовые данные, чтобы получить вашу позицию, но на Android, похоже, что телефон не имеет доступа к сотовой информации, если 3G не включен.
Это может показаться глупым, но активировал ли вы параметр "Использовать сети"?
Перейдите в Настройки → Местоположение и безопасность → Использовать сети; и активировать его. Я прошел весь день, наблюдая за проблемой, и это было так.
Я перезапустил и перезапустил. я reset мой телефон с настройками factory.
Но ничего не получилось.
Пока я не установлю enablHighAccuracy от true до false.
И... Тада.... это работает.
Итак:
var options;
options = {
maximumAge: 30000,
timeout: 5000,
enableHighAccuracy: false
};
Это хорошо работает, используя PhoneGap 2.6.0. Мне нужно было сделать это изменение, так как теперь я использую Phonegap 3.3 - протестирован на телефоне Wiko Cink +.
Попробуйте удалить плагин для геолокации плагина Phonegap из вашего проекта. Вам не нужно будет вносить какие-либо изменения в ваш код JavaScript, поскольку ваше устройство снова вернется к стандартной функции HTML5 navigator.geolocation, которая имеет тот же подпись метода.
Предполагая, что вы используете PhoneGap 3.3, вам просто нужно запустить:
cordova plugin rm org.apache.cordova.geolocation
Если вы используете эмулятор, возможно, это связано с тем, что у устройства нет набора геолокации. Попробуйте установить местоположение, выполнив следующее, если ваш эмулятор Android находится на порту 5554:
telnet localhost 5554
geo fix -0.001 51.5
Перезагрузите телефон или перейдите на карту google и проверьте, работает ли там gps. Я получил его работу.
У меня это случилось с рабочим приложением после обновления PhoneGap до версии 3.6.3 из 3.5. Попробовав много других предложений, Артур ответил. 15 секунд казались слишком длинными для меня, поэтому я использовал {timeout: 2000}. Я предполагаю, что новая версия работает медленнее, так как мой код работал отлично до обновления на тех же устройствах. Думал, что я опубликую, а также поддержу его, поскольку все, что я нашел в Google, касалось начальной настройки и в основном не имело отношения к моей ситуации.
Вам просто нужно добавить enableHighAccuracy: true, maximumAge: 60000
, а затем перезагрузить устройство.
Из моего анализа проб и ошибок, скорее всего: 1. Версия Android, которую вы используете. На Lollipop и ниже вам может потребоваться перейти к настройкам местоположения телефона и включить высокоточные настройки (с помощью gps, wlan и мобильных сетей, чтобы получить местоположение). Я должен был сделать это на телефоне kitkat. 2. Как уже упоминалось, вы можете попробовать изменить настройки getCurrentPosition путем включения/отключения высокой точности и добавления тайм-аута. 3.Если вы используете ngCordova, убедитесь, что вы установили его правильно, и функции местоположения на самом деле вызываются. Используйте консоль для проверки
Попробуйте это решение:
window.setInterval(checkPosition, 5000);
function checkPosition() {
function onSuccess(position) {
document.getElementById('result1').innerHTML = position.coords.latitude;
document.getElementById('result2').innerHTML = position.coords.longitude;
}
// onError Callback receives a PositionError object
//
function onError(error) {
alert('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
navigator.geolocation.getCurrentPosition(onSuccess, onError);
}