如何在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_ZONE
和setTimeZone
)
长答案
正如已经在多个线程中指出的那样,只有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
你可以用下面的方法通过代码来做到这一点:
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);
`