你无法在普通的现成手机上进行此操作,因为无法获得SET_TIME权限。该权限的保护级别为signatureOrSystem
,因此市场应用程序无法更改全局系统时间(但也许可以使用我还不知道的黑魔法)。
您不能使用其他方法,因为这在Linux层面上受到阻止(请参见下面的详细答案),这就是为什么所有使用终端和SysExec的尝试都会失败。
如果您能够获得该权限,可能是因为您已经root了手机或构建并签署了自己的平台映像,请继续阅读。
这是可能的,并已经实现过。您需要获得android.permission.SET_TIME
权限。之后通过Context.getSystemService(Context.ALARM_SERVICE)
和它的方法setTime()
使用AlarmManager
。
从Activity或Service设置时间为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()
直接写入由 system
拥有且缺少全局可写权限的设备文件 /dev/alarm
。因此,换句话说,只有以system
身份运行的进程才能使用SystemClock
方法。对于这种方式,Android权限并不重要,不存在检查适当权限的实体。
这就是内部预安装的设置应用程序的工作方式。它只在system
用户帐户下运行。
对于城镇中的所有其他用户,都有闹钟管理器。它是在system_server
进程下以system
用户身份运行的系统服务。它公开了上述的setTime
方法,但强制执行SET_TIME
权限,并在内部调用SystemClock.setCurrentTimeMillis
(由于闹钟管理器正在运行的用户,因此成功)。
干杯
根据这个讨论串,无论我们给予应用程序的权限如何,用户应用程序均无法设置时间。相反,最好的方法是要求用户手动设置时间。我们将使用:
startActivity(new Intent(android.provider.Settings.ACTION_DATE_SETTINGS));
很遗憾,没有直接将它们链接到时间设置的方法(这会为他们节省一次点击)。通过利用elapsedRealtime,我们可以确保用户正确设置时间。
对于已取得 root 权限的设备,可以执行以下命令:
您可以通过以下方法使用代码来实现此操作:
private void changeSystemTime(String year,String month,String day,String hour,String minute,String second){
try {
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
String command = "date -s "+year+month+day+"."+hour+minute+second+"\n";
Log.e("command",command);
os.writeBytes(command);
os.flush();
os.writeBytes("exit\n");
os.flush();
process.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
只需像这样调用先前的方法:
changeSystemTime("2015","04","06","13","09","30");
date 2015-04-06T13:09:30Z
。 - Alann Maulana我在列表中没有看到这个,但是它对我有用。我的设备已经root并且安装了超级用户,但如果超级用户可以在非root设备上使用,那么它可能会起作用。我使用了AsyncTask并调用了以下代码:
protected String doInBackground(String... params){
Runtime.getRuntime().exec("su && date -s " + params[0]);}
谢谢Penguin。在QuickShortcutMaker中,我准确地捕获了日期/时间设置活动的名称。因此,要启动系统时间设置:
Intent intent=new Intent();
intent.setComponent(new ComponentName("com.android.settings",
"com.android.settings.DateTimeSettingsSetupWizard"));
startActivity(intent);
`