[英]phonegap geolocation always fail on timeout
我在我的應用程序中使用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,當禁用該選項或信號被阻止時,地理位置無效。
我知道也許為時已晚,但今天我在同樣的問題上掙扎了! 解決方案結果非常簡單!
SOLUTION:重新啟動設備。
就這樣。
問題是,你永遠不知道我的用戶什么時候會遇到這種錯誤,所以如果你的應用程序在很大程度上依賴於地理位置,我建議你在位置選項中設置一個超時選項navigator.geolocation.getCurrentPosition(geoSuccess, geoError, {timeout: 15000})
並提醒用戶有關問題和可能的解決方案。
PS請記住,Geolocation可以超時,例如,如果移動數據也被關閉,那么重啟並不總能解決它。 在iPhone上,它使用手機數據來獲取您的位置,但在Android上,看起來手機無法訪問手機數據,除非3G開啟
這聽起來很愚蠢,但是,你是否激活了“使用網絡”選項?
轉到設置 - >位置和安全 - >使用網絡; 並激活它。 我整個下午都在看着這個問題,就是這樣。
我重新啟動並重新啟動。 我將手機重置為出廠設置。
但沒有任何效果。
直到我將enablHighAccuracy從true設置為false。
並且... Tada ......它有效。
所以:
var options;
options = {
maximumAge: 30000,
timeout: 5000,
enableHighAccuracy: false
};
這曾經使用PhoneGap 2.6.0正常工作。 我需要做出這個改變,因為我現在正在使用Phonegap 3.3 - 在Wiko Cink +手機上測試過。
如果您在模擬器上運行,可能是因為該設備沒有地理位置集。 嘗試通過運行以下設置位置,假設您的Android模擬器在端口5554上:
telnet localhost 5554
geo fix -0.001 51.5
嘗試從項目中刪除Phonegap插件地理位置插件。 您不需要對JavaScript代碼進行任何更改,因為您的設備將依賴於具有相同方法簽名的標准HTML5 navigator.geolocation功能 。
假設您正在使用PhoneGap 3.3,您只需要運行:
cordova plugin rm org.apache.cordova.geolocation
重新啟動手機或轉到谷歌地圖,檢查gps是否正在那里工作。 我搞定了。
從3.5將PhoneGap更新到版本3.6.3后,我發生了這種情況。 在嘗試了許多其他建議后,亞瑟的回答奏效了。 15秒對我來說似乎太長了所以我使用{timeout:2000}。 我猜測新版本速度較慢,因為我的代碼在相同設備上更新之前工作正常。 我以為我發布的內容以及對他的支持,因為我在谷歌發現的一切都與初始設置有關,而且與我的情況大多無關。
您只需添加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);
}
我已經設法解決了......但是,我不知道究竟是什么解決了它。 我所做的就是改變我的模型結構之一。 誰能看到與地理位置的聯系?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.