web-dev-qa-db-ja.com

Cordova 5.0.0のGeolocationプラグインは、常にタイムアウトの期限切れエラーを返します

これらのプラグインを使用してCordova5.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

タイムアウトが期限切れになると常に返されるのはなぜですか?

13

ばかげているように聞こえるかもしれませんが、携帯電話の「GPS」オプションを有効にしましたか?

12
Virako

私はついにこれが起こるすべての理由を解決しました。これは、maximumAgetimeoutの2つのオプションによるものです。デバイスやエミュレーターでアプリを実行していることに気付くかもしれません。私の場合、両方。電話のGPSは、エミュレーターよりも機能していました。デバイスで位置情報サービスをオンにする必要があります。また、タイムアウトを設定する必要があります。そうしないと、問題が発生します。エミュレーターの場合、エミュレーター設定を介してGPSデータをアプリに送信する必要があり、maximumAgeは、送信した時間よりも大きい数値(ミリ秒単位)に設定する必要があります。

また、エラーが発生した場合に次のような関数を呼び出して再試行するように設定しているので、エラーが発生するまで試行を続けます。

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

次に、onDeviceReadyブロックに次のようなものをすべてまとめます。

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

すべてのセットアップが完了すると、デバイスで正常に機能するはずです。エミュレーターの場合、アプリをロードしてから、フローティングメニューの[...]ボタンをクリックし、[送信]をクリックして、GPS座標をアプリに送信する必要があります。

Send GPS coordinates to Android emulator

これを行うと、アプリは常に再試行するため、GPS座標を使用してアラートをポップアップする必要があります。

5
xendi

私は答えを見つけました ここ 、それは私のために働いているようでした:

単にデバイスを再起動します

私のために働いた、うまくいけばあなたのためにも。

3
Codecat

私はSamsungTab Sを使用しています。以下のようにwatchOptionsからmaximumAgeとtimeOutを削除すると、うまくいきました。

var watchOptions = {
    enableHighAccuracy: true
};

var watch = $cordovaGeolocation.watchPosition(watchOptions);
2
Randev