更新:此方法不再适用于最新的 Android 版本。我知道的唯一其他方法是使用date 命令设置时间。请注意,命令格式可能因 Android 版本和安装的第三方工具而异(date 的 BusyBox 版本不支持时区)。
// Android 6 and later default date format is "MMDDhhmm[[CC]YY][.ss]", that's (2 digits each)
// month, day, hour (0-23), and minute. Optionally century, year, and second.
private static final SimpleDateFormat setDateFormat = new SimpleDateFormat("MMddHHmmyyyy.ss", Locale.US);
// Standard Android date format: yyyymmdd.[[[hh]mm]ss]
// http://stackoverflow.com/questions/5300999/set-the-date-from-a-shell-on-android
private static final SimpleDateFormat setDateFormat = new SimpleDateFormat("yyyyMMdd.HHmmss", Locale.US);
// BusyBox date format:
// [[[[[YY]YY]MM]DD]hh]mm[.ss]
// but recent versions also accept MMDDhhmm[[YY]YY][.ss]
private static final SimpleDateFormat bbSetDateFormat = new SimpleDateFormat("yyyyMMddHHmm.ss", Locale.US);
首先,我是ClockSync的开发者,我对在Android上设置时间有所了解。
恐怕Violet Giraffe 提供的答案不正确。问题是普通用户应用程序无法访问 SET_TIME 权限。此权限只能由作为 ROM 的一部分安装或使用与 ROM 本身相同的密钥签名的系统应用程序使用(取决于供应商)。使用这种方法的应用程序之一是NTPc。它使用 AOSP 密钥签名,可以安装在基于 AOSP 的 Android ROM 上,例如 CyanogenMod。请注意,Google 最近已从 Market 禁止 AOSP 密钥,并且作者将永远无法更新他的应用程序。 NTPc 无法安装在大多数手机使用的常规 ROM 上。
如果您需要详细信息,请务必阅读著名的 issue 4581 的 cmets:Allow user apps to set the system time。请注意,该问题已被 Google 拒绝,并附有以下评论:
您好,应用程序无法更改时间是设计使然。那里
安全的许多微妙方面可以依赖于当前时间,
如证书到期、许可证管理等。我们不
希望允许第三方应用程序在全球范围内破坏系统
以这种方式。
如何在 root 设备上设置时间:
ClockSync 设置时间的作用是更改/dev/alarm 设备的权限。本质上,它在根 shell 中运行 chmod 666 /dev/alarm。一旦此设备对所有用户都有写权限,SystemClock.setCurrentTimeMillis(...) 调用将成功。一些应用程序使用另一种方法,它们在带有适当参数的根 shell 中运行 date 命令,但是它容易出错并且不太准确,因为超级用户 shell 和命令执行可能需要几秒钟。此类应用程序的一个示例是Sytrant。
默认情况下,ClockSync 仅在 /dev/alarm 尚未可写时设置 666 权限。这节省了 CPU/电池,因为 su/Superuser.apk 执行相对昂贵。如果你担心安全问题,有Restore Permission选项,设置时间后报警器权限为664。
为了更轻松地从应用程序访问 root shell,我使用了自己的帮助程序类:ShellInterface。另一种选择是使用RootTools 库。
这里是基于ShellInterface类的示例代码:
public void setTime(long time) {
if (ShellInterface.isSuAvailable()) {
ShellInterface.runCommand("chmod 666 /dev/alarm");
SystemClock.setCurrentTimeMillis(time);
ShellInterface.runCommand("chmod 664 /dev/alarm");
}
}
请随时查看与设置时间相关的其他 Android 问题:
如果您需要应用程序中的精确时间而不使用 root 和更改系统时间,您可以拥有自己的计时器,例如基于 Joda Time。您可以使用 Apache commons-net 库中的 NTP 客户端从 NTP 服务器获取时间。