16

我在我的应用程序中使用 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,当禁用该选项或信号被阻止时,地理定位不起作用。

4

11 回答 11

32

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

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

就这样。

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

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

于 2013-05-15T09:48:36.707 回答
7

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

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

于 2012-10-12T13:40:13.553 回答
7

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

但没有任何效果。

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

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

所以 :

var options;

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

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

于 2014-01-31T13:38:43.243 回答
2

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

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

cordova plugin rm org.apache.cordova.geolocation
于 2014-02-03T15:58:37.460 回答
2

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

telnet localhost 5554
geo fix -0.001 51.5
于 2014-05-07T21:33:41.967 回答
1

重新启动您的手机或转到谷歌地图并检查 gps 是否在那里工作。我让它工作了。

于 2013-10-18T05:59:25.707 回答
0

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

于 2014-12-18T00:19:29.097 回答
0

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

于 2016-10-11T19:08:30.770 回答
0

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

于 2016-10-30T15:14:28.050 回答
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);
}
于 2017-01-16T18:13:35.133 回答
-4

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

于 2012-10-25T06:39:01.030 回答