web-dev-qa-db-ja.com

電話の時刻ではなく、「ネットワーク提供の値を使用する」という「自動」設定から「ネットワーク」時刻を取得するにはどうすればよいですか?

アプリケーションで、外部ソースから与えられたものと日付と時刻を同期する方法を見つけたいです。

電話時間を使いたくないのは、リアルタイムで5分程度の差が生じる可能性があるからです。あと5分以内で10分です!

GPS衛星またはネットワークアンテナの時間情報について聞いたことがあります。

System.getCurrentTimeを試しましたが、デバイスの現在の値を取得するため、デバイスが5分前にセットアップされている場合、間違った時間を表示します。

[〜#〜] edit [〜#〜]

短い質問をするために:この時間をどうやって取得できますか?

enter image description here

55
Waza_Be

知りませんでしたが、この質問は興味深いものでした。だから私はAndroidコードを掘りました...ありがとうオープンソース:)

表示される画面はDateTimeSettingsです。 「ネットワーク提供の値を使用する」チェックボックスは、共有設定_String KEY_AUTO_TIME = "auto_time";_および_Settings.System.AUTO_TIME_に関連付けられています

この設定は、2つのネットワークmAutoTimeObservers:ServiceStateTrackerおよびGsmServiceStateTrackerCdmaServiceStateTrackerという監視対象によって監視されます。

両方の実装は、設定がtrueになったときにrevertToNitz()というメソッドを呼び出します。どうやら [〜#〜] nitz [〜#〜] は、キャリアの世界ではNTPと同等です。

一番下の行:revertToNitz()のおかげで、キャリアから提供された値に時間を設定できます。残念ながら、ネットワーク時間を取得するメカニズムは見つかりませんでした。本当にこれを行う必要がある場合は、これらのServiceStateTrackers実装をコピーし、フレームワークによって提起された意図をキャッチし(推測)、mSavedTimeにゲッターを追加する必要があります。

56
rds

ライブラリを 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()
22
pretty angela

次のコードスニペットを試してください。

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"/>
7

これは私にとってはうまくいったようです:

LocationManager locMan = (LocationManager) activity.getSystemService(activity.LOCATION_SERVICE);
long networkTS = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getTime();

作業中Android 2.2 API(レベル8)

2
Thomas Getzoyan

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

1
Will Mayo

現在、現在の場所の時間を取得できますが、このためには、システムの永続的なデフォルトのタイムゾーンを設定する必要があります。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 をご覧ください。

0
badarshahzad