您无法使用普通的现成手机,因为无法获得SET_TIME权限。此权限拥有的ProtectionLevel的signatureOrSystem,所以没有办法对市场的应用程序更改全局系统时间(但也许有黑色vodoo魔法我还不知道)。
您无法使用其他方法,因为这在Linux级别上被阻止了(请参阅下面的长答案) - 这就是为什么所有使用终端和SysExecs的试验都会失败的原因。
如果您可以获得许可,或者因为您拥有手机,或者构建并签署了自己的平台图像,请继续阅读。
简答
这是可能的,并已完成。你需要android.permission.SET_TIME。然后使用AlarmManagervia Context.getSystemService(Context.ALARM_SERVICE)和它的方法setTime()。
用于将活动或服务的时间设置为2010/1/1 12:00:00的代码段:Calendar c = Calendar.getInstance();c.set(2010, 1, 1, 12, 00, 00);AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);am.setTime(c.getTimeInMillis());
如果要更改时区,则方法应该非常相似(请参阅android.permission.SET_TIME_ZONE和setTimeZone)
答案很长
正如在多个线程中指出的那样,只有system用户才能更改系统时间。这只是故事的一半。SystemClock.setCurrentTimeMillis()直接写入缺少世界可写权限/dev/alarm所拥有的设备文件system。换句话说,只有运行的进程system可以使用该SystemClock方法。对于这种方式,android权限无关紧要,没有涉及实体检查适当的权限。
这是内部预安装的设置应用程序的工作方式。它只在system用户帐户下运行 。
对于镇上的所有其他孩子,都有警报管理员。这是一个系统服务,在system_server- 猜测什么 - system用户帐户下运行。它公开了上述setTime方法,但强制执行SET_TIME权限,反过来只是SystemClock.setCurrentTimeMillis内部调用(由于警报管理器正在运行的用户而成功)。
~~~干杯