Android携帯電話時間自動同期


Android 2.3.4システムでは、Settings->Date&time->Automaticアイテムがオンになると、時間はネットワークを介して同期されますが、AndroidではデフォルトでNITZを使用してモバイルネットワーク時間を取得するため、モバイルネットワークサービス業者のサポートが必要ですが、一部のAndroid製品ではWIFIなどのワイヤレスネットワークのみをサポートし、モバイルネットワークをサポートしないものもあります.このときSNTP方式でネットワーク時間を同期して取得する必要があり、それに応じて変更する必要があるファイルは
frameworks/base/telephony/java/com/android/internal/telephony /cdma/CdmaServiceStateTracker.java
frameworks/base/telephony/java/com /android/internal/telephony/gsm/GsmServiceStateTracker.java

修正する必要があるのはすべて同じ内容で、以下の通りです.
      :
    import android.net.SntpClient;
          :
     
    private void revertToNitz() {
        if (Settings.System.getInt(phone.getContext().getContentResolver(),
                Settings.System.AUTO_TIME, 0) == 0) {
            return;
        }
        Log.d(LOG_TAG, "Reverting to NITZ: tz='" + mSavedTimeZone
                + "' mSavedTime=" + mSavedTime
                + " mSavedAtTime=" + mSavedAtTime);
        if (mSavedTimeZone != null && mSavedTime != 0 && mSavedAtTime != 0) {
            setAndBroadcastNetworkSetTimeZone(mSavedTimeZone);
            setAndBroadcastNetworkSetTime(mSavedTime
                    + (SystemClock.elapsedRealtime() - mSavedAtTime));
        }
    }

次のように変更します.
private void revertToNitz() {
        if (Settings.System.getInt(phone.getContext().getContentResolver(),
                Settings.System.AUTO_TIME, 0) == 0) {
            return;
        }
        Log.d(LOG_TAG, "Reverting to NITZ: tz='" + mSavedTimeZone
                + "' mSavedTime=" + mSavedTime
                + " mSavedAtTime=" + mSavedAtTime);
        if (mSavedTimeZone != null && mSavedTime != 0 && mSavedAtTime != 0) {
            setAndBroadcastNetworkSetTimeZone(mSavedTimeZone);
            setAndBroadcastNetworkSetTime(mSavedTime
                    + (SystemClock.elapsedRealtime() - mSavedAtTime));
            return;
        }
        int tryCount = 5;
        SntpClient client = new SntpClient();

        Log.i(LOG_TAG, "revertToNitz new sntpclient");

        for(int i = 0; i < tryCount; i++){
            if(client.requestTime("north-america.pool.ntp.org", 10000)) {
                long cachedNtp = client.getNtpTime();
                long cachedNtpTimestamp = SystemClock.elapsedRealtime();

                Log.i(LOG_TAG, "Sntp NtpTime = " + cachedNtp);

                setAndBroadcastNetworkSetTime(cachedNtp
                   + (SystemClock.elapsedRealtime() - client.getNtpTimeReference()));
                return;
            }
        }
    }

NITZ取得時間同期がサポートされていない場合はSNTP方式で時間を同期する.ただし,SNTP方式で時間同期を行う場合はタイムゾーンを同期できないため,自動同期を削除してタイムゾーンを設定してから自動同期を設定する必要があり,ネットワーク時間の同期更新を行うことができる.
時間同期は地域カード類別基地局事業者などの影響でandroid携帯電話のほとんどが時間同期がうまくいかない