16

ユーザーの位置情報を取得するためにアプリで sencha-touch 2.0 と phonegap 2.0.0 を使用しています。私のlocahostで実行すると、すべて正常に動作します。ただし、.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 に設定するまで。

そして...多田....うまくいきます。

そう :

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 プラグイン geolocation プラグインを削除してみてください。デバイスは、同じメソッド シグネチャを持つ標準の HTML5 navigator.geolocation 機能にフォールバックするため、JavaScript コードを変更する必要はありません。

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

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

于 2013-10-18T05:59:25.707 に答える
0

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

于 2016-10-11T19:08:30.770 に答える
0

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

于 2014-12-18T00:19:29.097 に答える
0

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

于 2016-10-30T15:14:28.050 に答える
-4

なんとか解決しました....しかし、実際に何が解決したのかわかりません。私が行ったのは、モデルの構造の 1 つを変更したことだけです。誰でも位置情報への接続を確認できますか?

于 2012-10-25T06:39:01.030 に答える