如何在android中设置移动系统时间和date?

如果您想在应用程序中更改移动系统的date或时间,那么您如何去做呢?

您不能在现有的普通手机上使用,因为无法获得SET_TIME权限。 这个权限具有signatureOrSystem的保护级别,所以市场上的应用程序无法改变全球系统时间(但也许还有我不知道的黑色vodoo魔法)。

您不能使用其他方法,因为这是在Linux级别阻止的(请参阅下面的长答案) – 这就是为什么所有使用terminal和SysExecs的试验都会失败。

如果您可以获得许可,或者是因为您已经植入了手机,或者已经创build并签署了自己的平台映像,请继续阅读。

简答

这是可能的,并已完成。 你需要android.permission.SET_TIME 。 之后通过Context.getSystemService(Context.ALARM_SERVICE)使用AlarmManager并使用方法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_ZONEsetTimeZone

长答案

正如已经在多个线程中指出的那样,只有system用户可以改变系统时间。 这只是故事的一半。 SystemClock.setCurrentTimeMillis()直接写入/dev/alarm ,这是system拥有的设备文件,缺乏世界可写权限。 换句话说,只有作为system运行的进程可以使用SystemClock方法。 对于这种方式android权限并不重要,没有涉及哪个实体检查适当的权限。

这是内部预安装的设置应用程序的工作方式。 它只是在system用户帐户下运行。

对于镇上其他所有的孩子都有报警pipe理员。 这是一个在system_server进程下运行的系统服务 – 猜测是什么 – system用户帐户。 它公开了所提到的setTime方法,但强制SET_TIME权限,并在内部调用SystemClock.setCurrentTimeMillis (由于用户报警pipe理器运行成功)。

~~~干杯

根据这个线程 ,用户应用程序不能设置时间,不pipe我们给它的权限。 相反,最好的方法是让用户手动设置时间 。 我们将使用:

 startActivity(new Intent(android.provider.Settings.ACTION_DATE_SETTINGS)); 

不幸的是,没有办法将它们直接链接到时间设置(这将节省更多的点击)。 通过使用ellapsedRealtime ,我们可以确保用户正确设置时间。

根源设备的解决scheme可以执行命令

  • date-YYYYMMDD.HHMMSS

更改cmd的日期

你可以用下面的方法通过代码来做到这一点:

 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"); 

我没有看到这个名单上的任何地方,但它为我工作。 我的设备是根源,我已经安装了超级用户,但是如果超级用户在非根用户设备上工作,这可能工作。 我使用了一个AsyncTask,并调用以下内容:

 protected String doInBackground(String... params){ Runtime.getRuntime().exec("su && date -s " + params[0]);} 

在我们的应用案例中,肮脏的解决方法是:

当用户连接到互联网时,我们获得互联网时间(NTP服务器),并比较内部设备时间(registederOffsetFromInternetTime)的差异( – )。 我们将其保存在用户的configurationlogging文件中。

我们使用devide + registederOffsetFromInternetTime的时间来考虑OUR应用程序的正确更新时间。

所有GETHOURstream程都检查实际时间与最后一次比较的时间(互联网时间)之间的差异。 如果超过10分钟,则更新registederOffsetFromInternetTime并保持准确性。

如果用户在没有互联网的情况下使用应用程序,我们只能使用存储为参考的registederOffsetFromInternetTime并使用它。 只要用户在离线状态下更改本地设备的小时数并使用应用程序,该应用程序就会考虑错误的时间。 但是,当用户回到互联网访问时,我们警告他关于时钟改变,要求重新同步所有或desconsider更新离线与不正确的小时。

感谢penquin。 在quickshortcutmaker中,正准确地记下date/时刻seting活动的名字。 所以开始系统时间设置:

 Intent intent=new Intent(); intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.DateTimeSettingsSetupWizard")); startActivity(intent); 

`