6

私のアプリはLocationListenerを使用して現在の場所を追跡します。GPSプロバイダーが定期的な修正を提供している限り、これはうまく機能します。ただし、修正が最新ではなくなったために場所が信頼できなくなった場合に、アプリがユーザーに警告するようにしたいです。したがって、timeCheckHandlerを使用して、数秒ごとにgetLastKnownLocationを呼び出しました。

私の問題は、正確な修正が頻繁に受信されている場合でも、getTime()をgetLastKnownLocationによって返される場所に適用することによって返される時間は、System.currentTimeMillis()によって返される現在の時間よりも一般的に古く、多くの場合約20秒古いことです。

onLocationChanged(arg0)にコードを追加して、修正時刻(arg0.getTime())と現在時刻(System.currentTimeMillis())をログに記録することにより、問題をさらに調査しました。ここでも、約20秒の違いがあります。

現在、コードは次のようになっています。

    public void onLocationChanged(Location arg0) {
    mapview.handleLocationChanged(mapview, arg0.getLatitude(), arg0.getLongitude(), arg0.getBearing(), arg0.getAccuracy(), "GPS fix");
    addDebugNote("Fix received at time: "+Long.toString(arg0.getTime()/1000)+" Now: "+Long.toString((System.currentTimeMillis())/1000));
}

デバッグファイルへの一般的な出力は次のとおりです。

Fix received at time: 1292091908 Now: 1292091928

修正時間と現在のシステム時間の間にこの違いが表示されるのはなぜですか?

約20秒の差が正常であることを受け入れる必要がありますか?

4

2 に答える 2

20

GPS位置特定時間は、ネットワークプロバイダーの時間/デバイスの時間とは無関係です。System.currentTimeMillis()は、デバイスに設定されたデバイス時間を提供します。

ポイントがどれくらい最近か知りたい場合は、次のことができます。

  1. アプリケーションの開始時にコード内の両方の時間(GPSとデバイス)を同期します。最初のGPS位置の更新を取得したらすぐに、両方の時間の差を取ります。その瞬間のクエリデバイスの時間で、両方の違いが何であるかを確認します。この違いを変数に保存します。

  2. これを後続の位置更新の補正係数として使用して、必要な参照フレームに基づいて正確な時刻を把握します。(デバイス時間またはGPS)

また、ロケーションプロバイダーとしてNETWORKを使用すると、デバイス時間のみを取得できることがわかりました。したがって、(GPSとネットワーク)の両方からの更新をリッスンしている場合は、location_obj.getProvider()を使用してこれを区別し、GPSプロバイダーを除外する必要がある場合もあります。

于 2010-12-19T04:57:55.697 に答える
1

今日テストを繰り返すと、GPS時間とシステム時間の差は22秒であることがわかりました。この問題はウェブ上の他の場所で議論されており、GPS時間と電話のシステム時間(私の場合はネットワークから自動的に更新されるように設定されています)の間に違いがあるのは正常なようです。1つの要因はGPSです時間はUTC時間から約15秒または17秒です(どちらのソースが正しいかによって異なります)... 1980年以降定期的な「うるう秒」のGPS時間が更新されていないため、同期がとれていません。

これを念頭に置いて、最新の修正がどれだけ最新であるかを確認する必要性に対する答えは、現在のシステム時刻を最新の修正のシステム時刻(GPS時刻ではない)と比較することだと思います。

于 2010-12-12T14:46:36.933 に答える