当前位置:   article > 正文

android系统时间设置时间格式,如何在Android中设置移动系统时间和日期?

android.provider.settings.global.date, newtimeinmillis); 报错

如何在Android中设置移动系统时间和日期?

当您想在应用程序中更改移动系统的日期或时间时,该如何做呢?

6个解决方案

64 votes

您无法使用普通的现成手持电话,因为无法获得SET_TIME权限。 该权限的保护级别为system_server,因此市场应用程序无法更改全球系统时间(但也许尚不知道使用黑色巫毒巫师)。

您不能使用其他方法,因为这是在Linux级别上阻止的(请参见下面的较长答案)-这就是为什么所有使用终端和SysExecs的试验都将失败的原因。

如果您因植根电话或构建并签署了自己的平台映像而获得许可,请继续阅读。

简短答案

这是可能的并且已经完成。 您需要system_server。然后通过system使用system_server,其方法为system_server。

Snippet for setting the time to 2010/1/1 12:00:00 from an Activity or Service:

Calendar c = Calendar.getInstance();

c.set(2010, 1, 1, 12, 00, 00);

AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);

am.setTime(c.getTimeInMillis());

如果要更改时区,则方法应该非常相似(请参见system_server和system_server)

长答案

正如在多个线程中指出的那样,只有system_server用户才能更改系统时间。 这只是故事的一半。 system直接写入setTime,这是SET_TIME缺少世界可写权限的设备文件。 因此,换句话说,仅运行为SystemClock.setCurrentTimeMillis的进程可以使用SystemClock方法。 通过这种方式,Android权限无关紧要,没有涉及检查适当权限的实体。

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

对于镇上所有其他孩子,有警报管理器。 这是一项系统服务,运行在system_server进程中-system用户帐户。 它公开了所提到的setTime方法,但强制执行SET_TIME权限,进而仅在内部调用SystemClock.setCurrentTimeMillis(由于用户使用警报管理器而成功,因此成功)。

干杯

jek answered 2020-08-09T10:25:20Z

21 votes

根据此线程,无论我们给予它什么权限,用户应用程序都无法设置时间。 相反,最好的方法是让用户手动设置时间。 我们将使用:

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

不幸的是,无法将它们直接链接到时间设置(这将使它们再节省一次单击)。 通过使用EllapsedRealtime,我们可以确保用户正确设置时间。

Casebash answered 2020-08-09T10:25:45Z

14 votes

有根设备的解决方案可以执行命令

它的

日期-s YYYYMMDD.HHMMSS

9451d57ba6ab082b215c5268d7860f28.png

您可以使用以下方法通过代码执行此操作:

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

Led Machine answered 2020-08-09T10:26:22Z

3 votes

我没有在清单上的任何地方看到这个,但是对我有用。 我的设备已root,并且已安装超级用户,但是如果超级用户可以在非root用户的设备上工作,那么这可能会起作用。 我使用了一个AsyncTask,并将其称为:

protected String doInBackground(String... params){

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

Slopes answered 2020-08-09T10:26:43Z

1 votes

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

当用户连接到Internet时,我们将获取Internet时间(NTP服务器)并比较内部设备时间的差异(-)(registederOffsetFromInternetTime)。 我们将其保存在用户的配置记录文件中。

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

所有GETHOUR进程都会检查实际时间与上一次比较的时间(与Internet时间)之间的时差。 如果时间超过10分钟,请进行新的比较以更新registederOffsetFromInternetTime并保持准确性。

如果用户在不使用Internet的情况下使用该应用程序,则我们只能使用作为参考存储的registederOffsetFromInternetTime并使用它。 即使用户离线时更改本地设备的小时数并使用该应用程序,该应用程序也会认为时间不正确。 但是,当用户重新访问互联网时,我们会警告他有关时钟已更改的问题,要求重新同步所有或取消考虑的更新已在不正确的小时内离线进行。

Vinicius Schneider answered 2020-08-09T10:27:21Z

-2 votes

谢谢企鹅。 在quickshortcutmaker中,我准确地捕获了日期/时间设置活动的名称。 因此开始系统时间设置:

Intent intent=new Intent();

intent.setComponent(new ComponentName("com.android.settings",

"com.android.settings.DateTimeSettingsSetupWizard"));

startActivity(intent);

`

barabek_AND_40_chelovek_Ltd answered 2020-08-09T10:27:46Z

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/594088
推荐阅读
相关标签
  

闽ICP备14008679号