PhoneGap地理定位总是超时失败

16

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

11个回答

32

我知道可能已经太晚了,但今天我也遇到了同样的问题!解决办法非常简单!

解决方法:重新启动设备。

就这些。

问题在于,你永远不知道用户何时会遇到这种错误,因此如果你的应用程序严重依赖地理位置服务,我建议在位置选项中设置超时 navigator.geolocation.getCurrentPosition(geoSuccess, geoError, {timeout: 15000}) 并向用户提醒该问题及其可能的解决方案。

P.S. 请记住,例如移动数据关闭时Geolocation可能会超时,所以重新启动并不总是有效。在 iPhone 上,它使用移动数据获取您的位置,但在 Android 上,似乎除非打开3G,否则手机无法访问移动数据。


谢谢Arthur!我已经有同样的问题几周了,一直搞不清为什么地理定位一直超时。而事实上,只需要把它关掉再打开就可以了!现在它正常运转了。但正如你所说的那样,设置超时并向用户显示相关警报非常重要,以防他们也遇到同样的问题。 - wicketyjarjar
1
请注意,定位可能会超时,例如如果移动数据也关闭了。在 iPhone 上,它使用蜂窝数据来获取您的位置,但在 Android 上,似乎除非开启 3G,否则手机无法访问蜂窝数据。 - Arthur
我不知道我花了多少个小时来弄清楚为什么它不起作用,而简单的重启就解决了问题!谢谢。 - rain01
1
重新启动设备是一种解决方案,但问题是“在幕后发生了什么?有任何想法吗?” - jmhostalet
起初我只是匆匆浏览了这个答案,然后先尝试了其他方法。出奇的是,它居然有效!谢谢。 - Brett Gregson
显示剩余3条评论

7

我不断地重启手机,甚至恢复出厂设置,但都没有用。

直到我将“enablHighAccuracy”从true改为false。

然后...咔擦...它终于可以使用了。

所以说:

var options;

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

在使用PhoneGap 2.6.0时,这个功能很正常。由于我现在使用的是Phonegap 3.3,所以我需要进行更改-在Wiko Cink+手机上进行了测试。


将enablHighAccuracy设置为false将不会提供准确的位置信息。当你将其设置为false时,它会给出你的WiFi、整数提供者的位置,这可能会在某些情况下导致定位到另一个城市或州。 - Jubin Patel

7

这可能听起来很愚蠢,但是你是否激活了"使用网络"选项?

前往设置->位置和安全->使用网络并启用它。我花了整个下午来解决这个问题,原来就是这个原因。


我遇到了一个问题,Galaxy S4上需要很长时间才能成功返回,进入设置,将位置服务切换关闭并重新开启解决了我的问题,成功返回只需一两秒钟。 - ScottN

2
尝试从您的项目中移除Phonegap插件地理定位插件。您无需对JavaScript代码进行任何更改,因为您的设备将返回标准HTML5 navigator.geolocation功能,其具有相同的方法签名。
假设您正在使用PhoneGap 3.3,则只需要运行:
cordova plugin rm org.apache.cordova.geolocation

2

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

telnet localhost 5554
geo fix -0.001 51.5

1

重启手机或打开谷歌地图检查 GPS 是否正常运行。我已经让它工作了。


0

你只需要添加 enableHighAccuracy: true, maximumAge: 60000 然后重新启动你的设备


0
我在将PhoneGap从3.5更新到3.6.3后,发现一个正常工作的应用程序出现了问题。尝试了许多其他建议后,Arthur的答案起作用了。对我来说,15秒似乎太长了,所以我使用了{timeout:2000}。我猜测新版本速度较慢,因为在更新之前我的代码在相同的设备上运行良好。我想把这个帖子发布出来,并点赞他的回答,因为我在Google上找到的所有内容都是关于最初的设置,大多数与我的情况无关。

0
从我的试错分析来看,最可能的原因是: 1. 你使用的安卓版本。在Lollipop及以下版本中,您可能需要前往手机位置设置并启用高精度设置(使用gps、wlan和移动网络获取位置)。我在一个kitkat手机上必须这样做。 2. 正如其他人所提到的,您可以尝试通过启用/禁用高精度并添加超时来更改getCurrentPosition的设置。 3. 如果您正在使用ngCordova,请确保正确安装了它并且位置函数实际被调用。使用控制台进行验证。

0

尝试这个解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接