Cordova 5.0.0上的Geolocation插件始终返回超时过期错误

时间:2015-05-23 05:56:24

标签: android cordova phonegap-plugins cordova-plugins

我已经使用这些插件安装了Cordova 5.0.0:

cordova插件列表

cordova-plugin-device 1.0.1-dev "Device"
cordova-plugin-geolocation 1.0.0 "Geolocation"
cordova-plugin-globalization 1.0.0 "Globalization"
cordova-plugin-inappbrowser 1.0.1-dev "InAppBrowser"
cordova-plugin-network-information 1.0.0 "Network Information"
cordova-plugin-whitelist 1.0.1-dev "Whitelist"

在任何Android虚拟设备上运行此代码:

onDeviceReady: function () {

    var onSuccess = function(position) {
        alert('Latitude: '          + position.coords.latitude          + '\n' +
              'Longitude: '         + position.coords.longitude         + '\n' +
              'Altitude: '          + position.coords.altitude          + '\n' +
              'Accuracy: '          + position.coords.accuracy          + '\n' +
              'Altitude Accuracy: ' + position.coords.altitudeAccuracy  + '\n' +
              'Heading: '           + position.coords.heading           + '\n' +
              'Speed: '             + position.coords.speed             + '\n' +
              'Timestamp: '         + position.timestamp                + '\n');
    };

    // onError Callback receives a PositionError object
    function onError(error) {
        alert('code: '    + error.code    + '\n' +
              'message: ' + error.message + '\n');
    }
    var options = { maximumAge: 3000, timeout: 5000, enableHighAccuracy: true };
    navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
}

返回:

D/CordovaNetworkManager( 1239): Connection Type: 3g
D/CordovaNetworkManager( 1239): Connection Extra Info: epc.tmobile.com
D/CordovaWebViewImpl( 1239): onPageFinished(file:///android_asset/www/index.html)
D/dalvikvm( 1239): GC_EXTERNAL_ALLOC freed 457K, 49% free 3174K/6151K, external 901K/1038K, paused 3ms
I/InputReader(  843): Device reconfigured: id=0x0, name=qwerty2, display size is now 240x400
I/InputManager-Callbacks(  843): No virtual keys found for device qwerty2.
D/SystemWebChromeClient( 1239): file:///android_asset/www/js/app.js: Line 127 : code: 3
D/SystemWebChromeClient( 1239): message: Timeout expired

为什么总是返回超时过期?

4 个答案:

答案 0 :(得分:11)

这听起来很愚蠢,但是,你是否激活了手机中的“GPS”选项?

答案 1 :(得分:4)

我终于解决了为什么会发生这种情况的所有原因。这是由于两个选项:timeoutmaximumAge。您可能会发现自己在设备和/或模拟器上运行应用程序。在我的情况下,两者。手机GPS比模拟器工作得更多。必须在设备上打开位置服务。您还需要设置超时或它会变得混乱。对于模拟器,您需要通过模拟器设置将GPS数据发送到您的应用程序,并且function gpsRetry(gpsOptions) { navigator.geolocation.getCurrentPosition(gpsSuccess, gpsError, gpsOptions); } 必须设置为比您发送它的时间更长的数字(以毫秒为单位)。

我也有我的设置,所以如果发生错误,它会再次通过调用这样的函数来尝试,所以它会继续尝试直到它得到它:

function gpsError(error, gpsOptions) {
    alert('code: '    + error.code    + "\n" +
          'message: ' + error.message + "\n");
    gpsRetry(gpsOptions);

}

我的错误功能是这样的:

function gpsSuccess(position) {
    alert('Latitude: '          + position.coords.latitude          + "\n" +
          'Longitude: '         + position.coords.longitude         + "\n" +
          'Altitude: '          + position.coords.altitude          + "\n" +
          'Accuracy: '          + position.coords.accuracy          + "\n" +
          'Altitude Accuracy: ' + position.coords.altitudeAccuracy  + "\n" +
          'Heading: '           + position.coords.heading           + "\n" +
          'Speed: '             + position.coords.speed             + "\n" +
          'Timestamp: '         + position.timestamp                + "\n");
}

我的成功功能是这样的:

let gpsOptions = {maximumAge: 300000, timeout: 5000, enableHighAccuracy: true};
navigator.geolocation.getCurrentPosition(gpsSuccess, gpsError, gpsOptions);

然后在onDeviceReady块中将所有内容放在一起:

|----+----+----+-----+----|
|  a |  b |  c |   d |  e |
|----+----+----+-----+----|
|  1 |  2 |  3 |   4 |  5 |
|  6 |  7 |  8 |   9 | 10 |
| 11 | 12 | 13 |  14 | 15 |
| 16 | 17 | 18 |  19 | 20 |
|----+----+----+-----+----|
| 34 | 38 | 42 | 160 | 50 |
|----+----+----+-----+----|
#+TBLFM: @>$5=vsum(@2$5..@-1$5)::@>$4=vsum(@2$1..@-1$4)::@>$3=vsum(@2$3..@-1$3)::@>$2=vsum(@2$2..@-1$2)::@>$1=vsum(@2$1..@-1$1)

完成所有设置后,它应该可以正常使用您的设备。对于模拟器,您需要加载应用程序,然后通过单击浮动菜单中的...按钮然后单击发送将GPS坐标发送到应用程序:

Send GPS coordinates to Android emulator

完成此操作后,由于您的应用始终在重试,因此应该使用GPS坐标弹出警报。

答案 2 :(得分:2)

我找到了答案here,这似乎对我有用:

只需重启设备

为我工作,希望也适合你。

答案 3 :(得分:1)

我正在使用Samsung Tab S.当我从watchOptions中移除maximumAge和timeOut时,它对我有用:

var watchOptions = {
    enableHighAccuracy: true
};

var watch = $cordovaGeolocation.watchPosition(watchOptions);