【问题标题】:phonegap geolocation always fail on timeoutphonegap 地理位置总是在超时时失败
【发布时间】:2012-10-03 06:57:55
【问题描述】:

我在我的应用程序中使用 sencha-touch 2.0 和 phonegap 2.0.0 来检索用户的位置。 在我的本地主机上运行时,一切正常。但是,当将 .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,当禁用该选项或信号被阻止时,地理定位不起作用。

【问题讨论】:

    标签: android cordova geolocation timeout sencha-touch-2


    【解决方案1】:

    我知道也许为时已晚,但今天我在同样的问题上苦苦挣扎!解决方案原来非常简单!

    解决方案:重启设备。

    就是这样。

    问题是,你永远不知道我的用户什么时候会遇到这种错误,所以如果你的应用程序严重依赖地理定位,我建议你在位置选项navigator.geolocation.getCurrentPosition(geoSuccess, geoError, {timeout: 15000}) 中设置超时并提醒用户有关问题和可能的解决方案.

    附: 请记住,地理定位可能会超时,例如,如果移动数据也被关闭,因此重启不会总是解决它。在 iPhone 上,它使用蜂窝数据来获取您的位置,但在 Android 上,除非打开 3G,否则手机似乎无法访问蜂窝数据

    【讨论】:

    • 谢谢亚瑟!几周以来我一直遇到同样的问题,但无法弄清楚为什么 Geolocation 一直超时。这只是一个必须将其关闭再打开的情况!现在工作正常。但正如您所说,设置超时并向用户显示相关警报非常重要,以防他们也遇到同样的问题。
    • 请记住,如果移动数据也被关闭,地理位置可能会超时。在 iPhone 上,它使用蜂窝数据来获取您的位置,但在 Android 上,除非打开 3G,否则手机似乎无法访问蜂窝数据。
    • 我不知道我花了多少时间来弄清楚为什么它不起作用,而简单的 REBOOT 就做到了! TY
    • 重启设备是一种解决方案,但问题是“门后发生了什么?知道吗?
    • 也许这篇文章对stackoverflow.com/questions/21975117/…有帮助
    【解决方案2】:

    这听起来很愚蠢,但是,您是否激活了“使用网络”选项?

    进入设置 -> 位置和安全 -> 使用网络;并激活它。我整个下午都在看这个问题,就是这样。

    【讨论】:

    • 我遇到了一个问题,即在 Galaxy S4 上返回成功需要永远,进入设置并切换位置服务并重新修复我的问题,并在一两秒内返回成功。
    【解决方案3】:

    我重新启动并重新启动。我将手机重置为出厂设置。

    但没有任何效果。

    直到我将 enablHighAccuracy 从 true 设置为 false。

    而且... Tada .... 它有效。

    所以:

    var options;
    
    options = {
        maximumAge: 30000,
        timeout: 5000,
        enableHighAccuracy: false
    };
    

    这在使用 PhoneGap 2.6.0 时可以正常工作。我需要进行此更改,因为我现在使用的是 Phonegap 3.3 - 在 Wiko Cink+ 手机上进行了测试。

    【讨论】:

      【解决方案4】:

      尝试从您的项目中删除 Phonegap 插件地理定位插件。您无需对 JavaScript 代码进行任何更改,因为您的设备将使用具有相同方法签名的 standard HTML5 navigator.geolocation functionality

      假设您使用的是 PhoneGap 3.3,您只需要运行:

      cordova plugin rm org.apache.cordova.geolocation
      

      【讨论】:

        【解决方案5】:

        如果您在模拟器上运行,可能是因为该设备没有设置地理位置。假设您的 android 模拟器在端口 5554 上,请尝试通过运行以下命令来设置位置:

        telnet localhost 5554
        geo fix -0.001 51.5
        

        【讨论】:

          【解决方案6】:

          重启你的手机或去谷歌地图看看gps是否在那里工作。 我搞定了。

          【讨论】:

            【解决方案7】:

            在将 PhoneGap 从 3.5 更新到版本 3.6.3 后,我的工作应用程序发生了这种情况。在尝试了许多其他建议之后,亚瑟的回答奏效了。 15 秒对我来说似乎太长了,所以我使用了 {timeout: 2000}。我猜新版本会更慢,因为我的代码在相同设备上更新之前运行良好。以为我会发布并支持他,因为我在 Google 中找到的所有内容都与初始设置有关,并且与我的情况几乎无关。

            【讨论】:

              【解决方案8】:

              您只需添加enableHighAccuracy: true, maximumAge: 60000,然后重启您的设备

              【讨论】:

                【解决方案9】:

                根据我的反复试验分析,最有可能的是: 1.您使用的安卓版本。在 Lollipop 及更低版本上,您可能需要转到手机位置设置并启用高精度设置(使用 gps、wlan 和移动网络获取位置)。我必须在 kitkat 手机上执行此操作。 2. 正如其他人所提到的,您可以尝试通过启用/禁用高精度和添加超时来更改 getCurrentPosition 的设置。 3.如果您使用的是ngCordova,请确保您安装正确并且实际调用了定位函数。使用控制台验证

                【讨论】:

                  【解决方案10】:

                  试试这个解决方案:

                  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);
                  }
                  

                  【讨论】:

                    【解决方案11】:

                    我已经设法解决了......但是,我不知道实际解决了它。我所做的只是改变我模型的一个结构。任何人都可以看到与地理定位的联系吗?

                    【讨论】:

                    • 同样的事情发生在我身上,当我移动到一个窗口时它开始工作
                    • 你到底做了什么?
                    猜你喜欢
                    • 1970-01-01
                    • 2012-01-03
                    • 1970-01-01
                    • 2016-03-26
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多