当前位置: 首页 > news >正文

如何用 Kotlin 在 Android 手机开发一个应用程序获取网络时间

使用 NTP 协议获取网络时间

build.gradle 文件中添加以下依赖:

implementation 'commons-net:commons-net:3.6'

创建 NTP 时间获取工具类:

import org.apache.commons.net.ntp.NTPUDPClient
import org.apache.commons.net.ntp.TimeInfo
import java.net.InetAddress
import java.util.*object NTPTimeHelper {private const val NTP_SERVER = "pool.ntp.org"private const val TIMEOUT = 30000fun getNetworkTime(): Date? {val client = NTPUDPClient()client.defaultTimeout = TIMEOUTreturn try {client.open()val info: TimeInfo = client.getTime(InetAddress.getByName(NTP_SERVER))info.computeDetails()Date(info.returnTime + info.offset)} catch (e: Exception) {null} finally {client.close()}}
}

通过 HTTP 请求获取时间

添加网络权限到 AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

使用 Retrofit 获取时间 API 响应:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

创建时间 API 服务接口:

interface TimeApiService {@GET("/")suspend fun getTime(): Response<Map<String, String>>
}

获取 HTTP 头部日期信息:

val retrofit = Retrofit.Builder().baseUrl("http://worldtimeapi.org/").addConverterFactory(GsonConverterFactory.create()).build()val service = retrofit.create(TimeApiService::class.java)
val response = service.getTime()
val dateString = response.headers()["Date"]
val date = SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US).parse(dateString)

使用 Android 系统 API 获取网络时间

通过系统设置获取自动时间:

fun isAutoTimeEnabled(context: Context): Boolean {return Settings.Global.getInt(context.contentResolver,Settings.Global.AUTO_TIME,0) == 1
}fun getCurrentNetworkTime(): Long {return System.currentTimeMillis()
}

处理运行时权限

检查并请求网络权限:

if (ContextCompat.checkSelfPermission(this,Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED
) {ActivityCompat.requestPermissions(this,arrayOf(Manifest.permission.INTERNET),PERMISSION_REQUEST_CODE)
}

显示获取到的时间

在 UI 线程更新显示:

CoroutineScope(Dispatchers.IO).launch {val networkTime = NTPTimeHelper.getNetworkTime()withContext(Dispatchers.Main) {textView.text = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(networkTime ?: Date())}
}

错误处理和重试机制

实现基本的错误处理:

fun getTimeWithRetry(maxRetries: Int = 3): Date? {var retryCount = 0while (retryCount < maxRetries) {try {return NTPTimeHelper.getNetworkTime()} catch (e: Exception) {retryCount++if (retryCount == maxRetries) {return null}Thread.sleep(1000)}}return null
}

http://www.dtcms.com/a/356256.html

相关文章:

  • OpenCV之霍夫变换
  • 在C++11中实现函数式编程的组合子
  • AI推介-大语言模型LLMs论文速览(arXiv方向):2025.04.25-2025.04.30
  • React Native 初体验
  • rabbitmq学习笔记 ----- 多级消息延迟始终为 20s 问题排查
  • OpenCV 图像预处理核心技术:阈值处理与滤波去噪
  • LubanCat-RK3568 UART串口通信,以及遇到bug笔记
  • CRYPT32!CryptMsgUpdate函数分析和asn.1 editor nt5inf.cat 的总览信息
  • 第八篇 永磁同步电机控制-MTPA、MTPV
  • 深入解析Qt节点编辑器框架:数据流转与扩展机制(三)
  • 实时音视频延迟优化指南:从原理到实践
  • 零知开源——基于STM32F407VET6和ADXL345三轴加速度计的精准运动姿态检测系统
  • Blender模拟结构光3D Scanner(三)获取相机观测点云的真值
  • OpenCV 基础知识总结
  • 无懈可击的 TCP AIMD
  • 亚马逊季节性产品运营策略:从传统到智能化的演进
  • kimi浏览器助手-月之暗面推出的智能浏览器扩展
  • docker中的mysql有中文显示问题跟大小写区分问题?
  • Python从入门到高手9.4节-基于字典树的敏感词识别算法
  • 使用Python脚本执行Git命令
  • React 状态丢失:组件 key 用错引发的渲染异常
  • Rust 安装与运行指南
  • Custom SRP - LOD and Reflections
  • 柳州市委常委、统战部部长,副市长潘展东率队首访深兰科技集团新总部,共探 AI 赋能制造大市与东盟合作新局
  • Claude Code 完整手册:从入门、配置到高级自动化
  • 【python】相机输出图片时保留时间戳数据
  • Linux学习——sqlite3
  • 179-183动画
  • IntelliJ IDEA2025+启动项目提示 Failed to instantiate SLF4J LoggerFactory
  • 零基础json入门教程(基于vscode的json配置文件)