アプリケーションで、外部ソースから与えられたものと日付と時刻を同期する方法を見つけたいです。
電話時間を使いたくないのは、リアルタイムで5分程度の差が生じる可能性があるからです。あと5分以内で10分です!
GPS衛星またはネットワークアンテナの時間情報について聞いたことがあります。
System.getCurrentTimeを試しましたが、デバイスの現在の値を取得するため、デバイスが5分前にセットアップされている場合、間違った時間を表示します。
[〜#〜] edit [〜#〜]
短い質問をするために:この時間をどうやって取得できますか?
知りませんでしたが、この質問は興味深いものでした。だから私はAndroidコードを掘りました...ありがとうオープンソース:)
表示される画面はDateTimeSettings
です。 「ネットワーク提供の値を使用する」チェックボックスは、共有設定_String KEY_AUTO_TIME = "auto_time";
_および_Settings.System.AUTO_TIME
_に関連付けられています
この設定は、2つのネットワークmAutoTimeObserver
s:ServiceStateTracker
およびGsmServiceStateTracker
のCdmaServiceStateTracker
という監視対象によって監視されます。
両方の実装は、設定がtrueになったときにrevertToNitz()
というメソッドを呼び出します。どうやら [〜#〜] nitz [〜#〜] は、キャリアの世界ではNTPと同等です。
一番下の行:revertToNitz()
のおかげで、キャリアから提供された値に時間を設定できます。残念ながら、ネットワーク時間を取得するメカニズムは見つかりませんでした。本当にこれを行う必要がある場合は、これらのServiceStateTracker
s実装をコピーし、フレームワークによって提起された意図をキャッチし(推測)、mSavedTime
にゲッターを追加する必要があります。
ライブラリを http://commons.Apache.org/net/download_net.cgi から取得します
//NTP server list: http://tf.nist.gov/tf-cgi/servers.cgi
public static final String TIME_SERVER = "time-a.nist.gov";
public static long getCurrentNetworkTime() {
NTPUDPClient timeClient = new NTPUDPClient();
InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
TimeInfo timeInfo = timeClient.getTime(inetAddress);
//long returnTime = timeInfo.getReturnTime(); //local device time
long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime(); //server time
Date time = new Date(returnTime);
Log.d(TAG, "Time from " + TIME_SERVER + ": " + time);
return returnTime;
}
getReturnTime()はSystem.currentTimeMillis()と同じです。
getReceiveTimeStamp()またはgetTransmitTimeStamp()メソッドを使用する必要があります。
システム時刻を1時間前に設定すると、違いがわかります。
local time :
System.currentTimeMillis()
timeInfo.getReturnTime()
timeInfo.getMessage().getOriginateTimeStamp().getTime()
NTP server time :
timeInfo.getMessage().getReceiveTimeStamp().getTime()
timeInfo.getMessage().getTransmitTimeStamp().getTime()
次のコードスニペットを試してください。
String timeSettings = Android.provider.Settings.System.getString(
this.getContentResolver(),
Android.provider.Settings.System.AUTO_TIME);
if (timeSettings.contentEquals("0")) {
Android.provider.Settings.System.putString(
this.getContentResolver(),
Android.provider.Settings.System.AUTO_TIME, "1");
}
Date now = new Date(System.currentTimeMillis());
Log.d("Date", now.toString());
マニフェストに許可を追加してください
<uses-permission Android:name="Android.permission.WRITE_SETTINGS"/>
これは私にとってはうまくいったようです:
LocationManager locMan = (LocationManager) activity.getSystemService(activity.LOCATION_SERVICE);
long networkTS = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getTime();
作業中Android 2.2 API(レベル8)
NITZはNTPの形式であり、レイヤー3またはNASレイヤーを介してモバイルデバイスに送信されます。通常、このメッセージはGMM情報として表示され、情報:
特定の通信事業者はこれをサポートしておらず、一部の通信事業者はこれをサポートしており、セットアップが正しくありません。
レイヤー3信号メッセージ
時間:9:38:49.800
GMM情報3GPP TS 24.008 ver 12.12.0 Rel 12(9.4.19)
Mプロトコル識別子(16進データ:8)
(0x8) Mobility Management message for GPRS services
Mスキップインジケータ(16進データ:0)値:0 Mメッセージタイプ(16進データ:21)メッセージ番号:33
Oネットワークタイムゾーン(16進データ:4680)タイムゾーン値:GMT + 2:00 O世界標準時とタイムゾーン(16進データ:47716070 70831580)年:17月:06日:07時間:07分:38秒:51タイムゾーン値:GMT + 2:00 Oネットワーク夏時間(16進数データ:490100)夏時間値:調整なし
レイヤー3データ:08 21 46 80 47 71 60 70 70 83 15 80 49 01 00
現在、現在の場所の時間を取得できますが、このためには、システムの永続的なデフォルトのタイムゾーンを設定する必要があります。setTimeZone(String timeZone)
Calendar calendar = Calendar.getInstance();
long now = calendar.getTimeInMillis();
TimeZone current = calendar.getTimeZone();
setAutoTimeEnabled(boolean enabled)
壁時計の時刻をNTPからの自動時刻更新と同期するかどうかを設定します。
TimeManager timeManager = TimeManager.getInstance();
// Use 24-hour time
timeManager.setTimeFormat(TimeManager.FORMAT_24);
// Set clock time to noon
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR_OF_DAY, 12);
long timeStamp = calendar.getTimeInMillis();
timeManager.setTime(timeStamp);
私はあなたの答えを読んだそのタイプの答えを探していましたが、満足しなかったし、少し古いものでした。新しいソリューションを見つけて共有しました。 :)
詳細については、 https://developer.Android.com/things/reference/com/google/Android/things/device/TimeManager.html をご覧ください。