0

我正在尝试在 C 中的 NDK 本机代码中设置设备时间。据我所知,最好的解决方案是使用 settimeofday()。

struct timeval tv = {timet, 0};
struct timezone tz = {timezone, daylight}; // The second timezone is long int. Time lib extern which perfectly suits here.
if (settimeofday(&tv, &tz) != 0)
{
    LOG(("settimeofday() failed: %s", strerror(errno)));
}

结果是

settimeofday() failed: Read-only file system

本地还有其他方式来设置时间吗?有可能吗?我查看了问题的只读文件系统部分,但我没有 Rooted 设备。

提前致谢!

4

2 回答 2

1

如果没有足够的权限,您无法设置设备时间,并且应用程序将无法在无根设备上获得该权限。从手册页:

   EPERM  The calling process has insufficient privilege to call  settime-
          ofday(); under Linux the CAP_SYS_TIME capability is required.

即使您确实设法设置了它,它也可能会在下次设备通过网络获得时间更新时被覆盖。

你得到的是 EROFS 而不是 EPERM,这有点奇怪。

于 2013-09-18T15:02:34.110 回答
1

Android 系统时钟映射到“/dev/alarm”,它只对非系统应用程序具有读取权限。因此,如果您尝试更改库存设备上的时间,那么您就不走运了。您必须使用 -

  1. 设置应用程序(这是一个以系统权限运行的系统应用程序)或
  2. 使用系统特权签署您的应用程序(除非您为供应商工作或推出自己的 FW,否则这是不可能的)

因此,如果您想仅使用您的应用程序更改系统时间,则必须将“/dev/alarm”的权限更改为可写(来自 adb shell 的 chmod 666 /dev/alarm)。为此,您需要有根设备。

更改权限后,您将能够使用应用程序中的 Java API (SystemClock.setCurrentTimeMillis()) 更改时间。

我仍然无法使其与 settimeofday() 或 clock_settime() 一起工作。

希望这可以帮助。

于 2013-09-19T06:15:42.387 回答