1. 问题:如果设备有机会处于外网,一般不会有系统时间自动同步问题,但是存在一些使用场景就是设备一直处于局域网环境,如果设备关机一段时间了,再启动设备后,时间可能是1970或者其实错误时间
2. 解决方法:系统时间的自动更新是通过ntp server服务在外网可用时自动请求和同步系统时间的,我们只需要将ntp server服务地址设置为我们的内网服务端地址即可。当然前提是内网服务端开启了ntp服务,具体怎么开启自行百度或者Google。
3. 代码实现(部分系统要求是系统app或者有系统权限的app才能修改成功):
val ipAddress = "192.168.101.123"
LogUtils.d("tryUpdateNtpServer ipAddress=$ipAddress")
if (ipAddress.isEmpty()) {LogUtils.d("tryUpdateNtpServer ipAddress is empty")return
}val ntpServerKey = "ntp_server"
val oldNtpServer = Settings.Global.getString(context.contentResolver, ntpServerKey) //先获取判断一下是不是添加过了
LogUtils.d("tryUpdateNtpServer oldNtpServer=$oldNtpServer")
if (!oldNtpServer.isNullOrEmpty() && oldNtpServer.contains(ipAddress)) {LogUtils.d("tryUpdateNtpServer already set ntp_server")return
}Settings.Global.putString(context.contentResolver, ntpServerKey, ipAddress) //使用Settings.Global.putString设置
var newNtpServer = Settings.Global.getString(context.contentResolver, ntpServerKey)
if (!newNtpServer.isNullOrEmpty() && newNtpServer.contains(ipAddress)) {LogUtils.d("tryUpdateNtpServer set ntp_server by Settings.Global.putString success")ToastUtils.showLong("设置NTP服务器成功,正在重启设备生效")ThreadUtils.getMainHandler().postDelayed({ ShellUtils.execCmd("reboot", false) }, 2000) //设置成功需要重启设备之后才能生效return
}
LogUtils.d("tryUpdateNtpServer set ntp_server by Settings.Global.putString failed")
ShellUtils.execCmd("settings put global $ntpServerKey $ipAddress", false) //如果设置失败,尝试使用settings put global命令设置,ShellUtils.execCmd来自依赖库com.blankj:utilcode:1.30.7
newNtpServer = Settings.Global.getString(context.contentResolver, ntpServerKey)
if (!newNtpServer.isNullOrEmpty() && newNtpServer.contains(ipAddress)) {LogUtils.d("tryUpdateNtpServer set ntp_server by settings put global success")ToastUtils.showLong("设置NTP服务器成功,正在重启设备生效")ThreadUtils.getMainHandler().postDelayed({ ShellUtils.execCmd("reboot", false) }, 2000) //设置成功需要重启设备之后才能生效return
}
LogUtils.d("tryUpdateNtpServer set ntp_server by settings put global ntp_server failed")