赞
踩
如何在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
您可以使用以下方法通过代码执行此操作:
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
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。