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

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

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

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

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

РЕДАКТИРОВАТЬ

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

введите описание изображения здесь

Я не знал, но нашел интересный вопрос. Итак, я выкопал код Android … Спасибо 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 .

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

Попробуйте этот fragment кода:

 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()); 

Не забудьте добавить разрешение в манифест

  

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

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

Работа с API Android 2.2 (уровень 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 Дискриминатор протокола (шестнадцатеричные данные: 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 Сеть Переход на летнее время (шестнадцатеричные данные: 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.

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

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

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

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

  • Как настроить статический IP-адрес, сетевую маску, шлюз программно на Android 3.x или 4.x
  • Создайте NinePatch / NinePatchDrawable во время выполнения
  • Сетевые инструменты, которые имитируют медленное сетевое подключение
  • Давайте будем гением компьютера.