簡體   English   中英

phonegap地理位置在超時時總是失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM