web-dev-qa-db-ja.com

phonegapgeolocationは常にタイムアウト時に失敗します

アプリでsencha-touch2.0とphonegap2.0.0を使用して、ユーザーの場所を取得しています。私のlocahostで実行すると、すべてが正常に機能します。ただし、.apkをmy 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));
         }   
     }
}

PDATE:それで、私は自分の建物から出て、それはうまくいきました...私はもっと頻繁に外に出る必要があります。
ただし、gpsを無効にすると、geoLocationはwifi接続を使用して自分の場所を見つけると思いましたが、失敗します(enableHighAccuracy:falseを設定しています)。何故ですか?

PDATE:質問を言い換えます:navigator.geolocation.watchPositionはGPS信号とwifi/g3信号の両方で機能すると想定していますか?インターネット接続のみを使用してユーザーの場所を検出するにはどうすればよいですか?現在、私のコードはGPSでのみ機能しており、そのオプションが無効になっている場合、または信号がブロックされている場合、ジオロケーションは機能しません。

16
gsuoyb

ばかげているように聞こえるかもしれませんが、「ネットワークを使用」オプションを有効にしましたか?

[設定]-> [場所とセキュリティ]-> [ネットワークを使用]に移動します。そしてそれをアクティブにします。私は問題を見て午後中ずっと過ぎました、そしてそれはそれでした。

7
user1671553

再起動して再起動しました。電話を工場出荷時の設定にリセットしました。

しかし、何も機能しませんでした。

EnablHighAccuracyをtrueからfalseに設定するまで。

そして...多田....それは動作します。

そう :

var options;

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

これは、PhoneGap2.6.0を使用して正常に機能していました。現在Phonegap3.3を使用しているため、この変更を行う必要がありました。WikoCink+電話でテスト済みです。

6
Alain Zelink

エミュレータで実行している場合は、デバイスにジオロケーションが設定されていないことが原因である可能性があります。 Androidエミュレーターがポート5554にあると仮定して、以下を実行して場所を設定してみてください。

telnet localhost 5554
geo fix -0.001 51.5
2
Blueberry

プロジェクトからPhonegapプラグインジオロケーションプラグインを削除してみてください。デバイスは同じメソッドシグネチャを持つ 標準のHTML5 navigator.geolocation機能 にフォールバックするため、JavaScriptコードに変更を加える必要はありません。

PhoneGap 3.3を使用していると仮定すると、以下を実行する必要があります。

cordova plugin rm org.Apache.cordova.geolocation
2
Ian

私の試行錯誤の分析から、最も可能性が高いのは次のとおりです。1。使用しているAndroidのバージョン。Lollipop以下では、電話の位置設定に移動して、高精度の設定を有効にする必要があります。 (gps、wlan、モバイルネットワークを使用して位置を取得します)KitKat電話でこれを行う必要がありました。2。他の人が述べたように、高精度を有効/無効にし、タイムアウトを追加することで、getCurrentPositionの設定を変更してみてください。3 .ngCordovaを使用している場合は、正しくインストールされており、ロケーション関数が実際に呼び出されていることを確認してください。コンソールを使用して確認してください

0
Emmanuel N K

PhoneGapを3.5からバージョン3.6.3に更新した後、動作中のアプリでこれが発生しました。他の多くの提案を試した後、アーサーの答えはうまくいきました。 15秒は長すぎるように思えたので、{timeout:2000}を使用しました。同じデバイスで更新する前にコードが正常に機能したため、新しいバージョンの方が遅いと思います。グーグルで見つけたものはすべて初期設定に関するものであり、私の状況とはほとんど関係がないので、私は彼を投稿するだけでなく賛成するつもりでした。

0
user2246924

このソリューションを試してください:

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

携帯電話を再起動するか、Googleマップに移動して、GPSがそこで機能しているかどうかを確認します。私はそれを動かしました。

0
Rohit Patel

enableHighAccuracy: true, maximumAge: 60000を追加してからデバイスを再起動を追加するだけです。

0
Roman Galochkin