API времени Play Services

API времени предоставляет доступ к сигналам времени, поддерживаемым точным сервисом учета времени Google Play Services .

Это полезно, если вам нужно узнать точное время UTC, поскольку системные часы Android могут показывать неверное время, если пользователь установил их вручную.

Ранее для получения внешнего времени с сервера времени вам, возможно, приходилось включать в приложение NTP-клиент. API времени помогает разработчикам получать более надежную информацию о времени.

API платформы Android предоставляют метод SystemClock.currentNetworkTimeClock() , но он доступен только в API уровня 33 и выше. TrustedTimeClient предоставляет альтернативные методы и информацию о пределах точности возвращаемого времени.

Предварительные требования к приложению

  • Убедитесь, что в файле сборки вашего приложения используются следующие значения:
    • Минимальная версия SDK — 21 или выше.
    • Скомпилируйте SDK версии 21 или выше.

Настройте свое приложение

  1. В файле build.gradle на уровне проекта укажите репозиторий Maven от Google и центральный репозиторий Maven как в разделе buildscript , так и в разделе allprojects :
      buildscript {
          repositories {
              google()
              mavenCentral()
          }
      }
    
      allprojects {
          repositories {
              google()
              mavenCentral()
          }
      }
      
  2. Добавьте зависимости для Time API в файл Gradle на уровне приложения вашего модуля, обычно это app/build.gradle :
      dependencies {
        implementation 'com.google.android.gms:play-services-time:16.0.1'
      }
      

Инициализация клиента TrustTime

Простейший способ интеграции — инициализировать TrustedTimeClient на раннем этапе жизненного цикла приложения. Это можно сделать в методе onCreate() класса Application и хранить клиент в синглтоне Application . Это позволит использовать клиент на протяжении всего приложения.

  class MyApplication : Application() {
      var trustedTimeClient: TrustedTimeClient? = null
        private set

      override fun onCreate() {
        super.onCreate()
        val initializeTrustedTimeClientTask = TrustedTime.createClient(this)
        initializeTrustedTimeClientTask.addOnCompleteListener { task ->
          if (task.isSuccessful) {
            // Stash the client
            trustedTimeClient = task.result
          } else {
            // Handle error, maybe retry later
            val exception = initializeTrustedTimeClientTask.exception
          }
        }
        // To use Kotlin Coroutine, you can use the await() method, see
        // https://developers.google.com/android/guides/tasks#kotlin_coroutine
        // for more info.
      }
    }
  }

Используйте TrustedTimeClient в любом месте вашего приложения.

  // Retrieve the TrustedTimeClient from your application class
  val myApp = applicationContext as MyApplication

  // In this example, System.currentTimeMillis() is used as a fallback if the
  // client is null (i.e. client creation task failed) or when there is no time
  // signal available. You may not want to do this if using the system clock is
  // not suitable for your use case.
  val currentTimeMillis =
    myApp.trustedTimeClient?.computeCurrentUnixEpochMillis()
        ?: System.currentTimeMillis()
  // trustedTimeClient.computeCurrentInstant() can be used if you'd rather use
  // Instant instead of long for Unix epoch times and you are able to use the APIs.