8

この質問は少し長文かもしれませんが、多くの提案を受け付けています。


問題
の説明: アミューズメント パーク、つまりジェット コースターで加速度データを記録するために使用する API レベル 8 (Android 2.2) MyTouch デバイスがいくつかあります。また、加速度計のポイントを記録された時間の関数としてプロットして表示できる視覚化機能もあります。ここにジレンマがあります。Android デバイスのシステム時刻はすべて同じというわけではなく、ミリ秒の精度で同じ時刻に設定することもできません (分単位の精度で手動でのみ設定できますが、これはひどいことです)。


解決策の試み:
そこで、まず、アプリの開始時に見つかった GPS 時刻に従ってデータを記録することにしました。長いプロセスの短い: GPS 時間を取得し、システム時間を取得し、差を取得し、データ ポイントを記録したら、システム時間を再度取得し、差を時間に追加し、記録の開始時間としてラベルを付け、それぞれに対して 200 ミリ秒ずつインクリメントします。そこから記録されたデータポイント。ただし、2 つの問題があります (GPS 時刻の取得に関して)。

  • 使用getLastKnownLocation()はあまり正確ではありません。実際、それは非常に不正確なようです。現在の GMT/UTC 時間から 9 分ずれている時間が表示されます。ただし、偶然にも、システム時間も Android デバイスで 9 分近くずれています... GPS 時間とシステム時間の差は通常、1000 ~ 5000 ミリ秒 (1 ~ 5 秒) です。私のコードが間違っている可能性があると思います。下に貼っておきますのでご覧ください。

  • requestSingleUpdate()より最近の場所とおそらく非常に正確な時間を取得できるため、使用するのに最適です。問題?API レベル 9 が必要です... 私たちが持っていないデバイス。


アイデア:
ここに私が思いついたアイデアがあります - ウェブサイトから何らかの方法でグローバル時間を取得し、そこから取得した時間を記録の時間として使用するとどうなるでしょうか? ここに問題があります - どうすればいいのかわかりません。それは私の希望的観測です...

別のアイデア -getTime()私が単に知らないグローバルタイプの関数はありますか?


私が Android に同様の時計から時間を引き出すようにしたい理由:
ジェット コースターに 2 人が座っていると想像してください。データを記録するとき、前の人は明らかに後ろの人よりもわずかに加速を経験します (これを可視化グラフで確認したいと思います)。そのため、これらのポイントが単一のグローバル時間に従って記録されることが、ミリ秒の精度で重要です。


コード:

Criteria c = new Criteria();
c.setAccuracy(Criteria.ACCURACY_FINE);

if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    mLocationManager.requestLocationUpdates(mLocationManager.getBestProvider(c, true), 0, 0, AmusementPark.this);
    Criteria criteria = new Criteria();
    String bestProvider = mLocationManager.getBestProvider(criteria, false);
    Location location = mLocationManager.getLastKnownLocation(bestProvider);

    try {

        gpsTime = location.getTime();
        systemTime = System.currentTimeMillis();
        timeDif = gpsTime - systemTime;
        Log.e("timedif", "GPS: " + gpsTime + ", System: " + systemTime +", Dif: " + timeDif);

    } catch (NullPointerException e){

    }

}

更新:
ここでは、誰かが一種の「サーバー」を提案していますgetTime()。私は彼のコード/回答が本当に好きですが、これが最善の解決策である場合、この「サーバー」とは何ですか、および/またはどのように設定しますか?

4

1 に答える 1

2

その投稿でレスポンダーが言及している「サーバー」は、専用のタイムサーバーをセットアップすることだと思います。基本的には、アプリを使用するすべての人が時間を得るために接続するハードウェアをセットアップします。あなたが望んでいる以上の努力かもしれません。

次のものが必要です。

  1. いくつかの予備のハードウェア (Tomcat を実行するコンピューターのように単純な場合もあれば、アプリを使用する予定の人数に応じて専用サーバー ラックのように複雑な場合もあります)、またはドメイン サーバー/Web ホストへのサブスクリプション。

  2. アプリが要求するたびに時間を返すだけの Web サービス。

  3. サーバー/Webサービスを公開する必要がありますが、これはまったく別の頭痛の種です.

専用サーバーに到達するにはネットワーク接続に依存するため、それが最適なソリューションになるかどうかはわかりません。試すことができる代替ソリューションがいくつかあります。

あなたのアプリが公開されるのか、それとも特に研究目的で使用されるのかはわかりません。後者で、あなたが知っていて調整できる人々のグループと一緒にいる場合は、ClockSyncをダウンロードし、電話を同じタイムサーバーに同期してから、アプリを実行することをお勧めします.

連絡先のない人にアプリを配布する場合、おそらく最善の策は、アプリを 1 つの ntp サーバーに接続させ、その方法で時間を取得することです。使用できる公開 ntp サーバーのリストは次のとおりです: http://www.pool.ntp.org/en/

さらに詳しい情報は次のとおりです。

クロック同期

SNTP接続のサンプルコード

情報が決定を下す際に役立つことを願っています。

于 2012-06-25T17:02:55.057 に答える