web-dev-qa-db-ja.com

同期Android GPS時間経由でデバイス?

ショートバージョン:

問題:複数のAndroidデバイスがまったく同時に(約100ミリ秒以内に)何かを実行する必要があります。たとえば、すべてのデバイスが以前に決定された時点で特定のサウンドを再生する必要があります。

質問:GPS時間を使用して、デバイスの時計が同期されていることを確認できますか?

長いバージョン:

Androidデバイスを持っている複数の人が同じ屋外の場所にいます(特定のスポーツイベントの場合)。すべてのデバイスは、特定のイベントをまったく同時に通知する必要があります(事前に決定される時間とそれ彼らが同時にそれをする限り、彼らが正確にその時にそれをすることは重要ではありません)FWIW:それらのイベントは人々が同時に彼らのスポーツ活動を始めるのを助けます。

これが私が作ることができる仮定です:

  • セルカバレッジがある場合とない場合があります。 (屋外にあり、都市部から遠く離れている可能性があります)
  • デバイスはインターネットに接続されている場合と接続されていない場合があります。 (一部の人はデータプランを持っていないかもしれません)
  • デバイスは相互に通信できます。デバイスがインターネットに接続されていない場合は、wifi経由で接続されます(ただし、wifiにはインターネットゲートウェイがない場合があります)。
  • デバイスは屋外にあります(建物の内部ではありません)。 (それは良いことです、それはすべてのデバイスがGPS修正を取得できることを意味します)
  • デバイスは互いに物理的に近接しています(つまり、300 m2以内)。 (それが重要かどうかはわかりません)

内部時計を使用してイベントを再生するタイミングを知ることはできません。ユーザーは手動で時刻を変更でき、デバイスがセルラーネットワークから時刻を取得するように設定されている場合でも、そのネットワークが正確な時刻を提供しない可能性があります。 2つのデバイスが異なるネットワークに予約されている可能性があるため、それらの時刻が十分に同期されていない可能性があります。

アプリの起動時に、各デバイスはGPS修正を要求し、GPS時間とその内部時計の差を保存できます。これで、マスターはこのGPS時間に基づいてイベントをアナウンスできます(内部クロックを使用し、以前に保存したオフセットを差し引くことにより)。

これは十分に正確で信頼できるでしょうか?

アンドレアス・ライトナー、よろしくお願いします。

20
user1057534

currentTimeMillis()コールバックの Location.getTime() およびonLocationChanged()からミリ秒単位の時間差を取得できます。 requestSingleUpdate() を使用します


追加したいのですが、ユーザーがデータ接続を使用している場合は、NTP時間を使用できます。これは、GPS内部クロックがドリフトし、修正に時間がかかる可能性があるため、さらに正確です。


編集:この回答を編集したいと思います。 Android OSでGNSS開発者として働いた後、多くの 'メジャー' Android OEMがこれを台無しにしていることに気付きました。通常、NMEA文はチップセットまたはGNSSスタック。タイミングが適切な場合もありますが、実装によって異なります。

また、うるう秒の問題もあります。 GPS時刻はUTC時刻ではありません。そしてこれの時点で それを書くことは18秒進んでいます

また、ドキュメントによると、GPS時間from Locationオブジェクトはシステム時間になりました

TLDR:使用 NTP時間

13
Reno

一部のデバイスでは取得された時間が1日進んでいるという既知の問題があるため、GPS時間に完全に依存することはできません。その場合、大きなオフセットが発生する可能性があります。

http://code.google.com/p/Android/issues/detail?id=23937

この問題を解決するための回避策については、ここで説明しています: Android:Samsung GalaxyTabsおよびAndroid 2.2デバイスは2012年1月1日から1日前にGPS日付を表示

2
muneikh

UTCはGPSから派生しておらず、APKはGPSを上書きします。 Android GPSクロックを無視するように設定されています。getTime()はNISTです。GPSではありません

0
Joel Thacker