Подтвердить что ты не робот

Как я могу получить "сетевое" время (из параметра "Автоматический" под названием "Использовать сетевые значения" ), а не время на телефоне?

Я хотел бы в своем приложении найти способ синхронизации даты и времени с чем-то, предоставленным внешним источником.

Я не хочу использовать телефонное время, потому что я могу получить разницу в 5 минут в реальном времени. и 5 минут дополнительно или менее = 10 минут!

Я слышал информацию о времени на спутниках GPS или в сетевых антеннах.

Я попытался с System.getCurrentTime, но я получил текущее устройство, поэтому, если мое устройство настроено на 5 минут раньше, оно отображает неправильное время.

ИЗМЕНИТЬ

Чтобы задать короткий вопрос: как я могу получить это время?

enter image description here

4b9b3361

Ответ 1

Я не знал, но нашел интересный вопрос. Итак, я выкопал код андроида... Спасибо open-source:)

Отображаемый экран DateTimeSettings. Флажок "Использовать сетевые значения" связан с общим предпочтением String KEY_AUTO_TIME = "auto_time";, а также с Settings.System.AUTO_TIME

Эти настройки наблюдаются наблюдаемым именем mAutoTimeObserver в 2-й сети ServiceStateTracker s: GsmServiceStateTracker и CdmaServiceStateTracker.

Обе реализации вызывают метод, называемый revertToNitz(), когда настройки становятся истинными. По-видимому, NITZ является эквивалентом NTP в мире операторов.

Нижняя строка: вы можете установить время на значение, предоставленное несущей, благодаря revertToNitz(). К сожалению, я не нашел механизм для получения сетевого времени. Если вам действительно нужно это сделать, я боюсь, вам придется скопировать эти реализации ServiceStateTracker, поймать намерение, поднятое фреймворком (я полагаю), и добавить getter в mSavedTime.

Ответ 2

Получить библиотеку из 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()

Ответ 3

Попробуйте этот фрагмент кода:

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

Ответ 4

Казалось, это сработало для меня:

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

Работа с API Android 2.2 (уровень 8)

Ответ 5

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 Дискриминатор протокола (шестнадцатеричные данные: 8)

(0x8) Mobility Management message for GPRS services

Индикатор перехода M (шестнадцатеричные данные: 0)   Значение: 0 M Тип сообщения (шестнадцатеричные данные: 21)   Номер сообщения: 33

O Сетевой часовой пояс (шестнадцатеричные данные: 4680)   Значение часового пояса: GMT + 2: 00 O Универсальное время и часовой пояс (шестнадцатеричные данные: 47716070 70831580)   Год: 17   Месяц: 06   День: 07   Час: 07   Минута: 38   Второе: 51   Значение часового пояса: GMT + 2: 00 O Network Переход на летнее время (шестнадцатеричные данные: 490100)   Летнее время: нет регулировки

Данные уровня 3:   08 21 46 80 47 71 60 70 70 83   15 80 49 01 00

Ответ 6

сигнал времени не встроен в сетевые антенны: вам нужно использовать протокол NTP для получения времени на сервере ntp. существует множество ntp-клиентов, доступных как автономные исполняемые файлы или библиотеки.

gps-сигнал действительно содержит точный сигнал времени, который доступен с любым "исправлением".

однако, если ни сеть, ни gps не доступны, ваш единственный выбор - прибегать к времени телефона... вашим лучшим решением было бы использовать системную настройку, чтобы автоматически синхронизировать время телефона с gps или ntp, тогда всегда используйте время телефона.

обратите внимание, что время телефона, если оно синхронизировано регулярно, не должно сильно отличаться от времени gps или ntp. также обратите внимание, что принуждение пользователя синхронизировать свое время может быть навязчивым, лучше спросите своего пользователя, соглашается ли он на синхронизацию. наконец, вы уверены, что вам абсолютно нужно точное время?