如果您想更改应用程序中的移动系统日期或时间,您将如何进行此操作?
答案 0 :(得分:62)
您无法使用普通的现成手机,因为无法获得SET_TIME权限。此权限具有signatureOrSystem
android.permission.SET_TIME
,因此市场应用无法改变全球系统时间(但可能还有黑色vodoo魔法,我还不知道)。
你不能使用其他方法,因为这在Linux级别被阻止了(参见下面的长答案) - 这就是为什么所有使用终端和SysExecs的试验都会失败。
如果你获得了许可,要么是因为你手机的根源,要么是建立并签署了自己的平台图像,请继续阅读。
这是可能的,并且已经完成。您需要Context.getSystemService(Context.ALARM_SERVICE)
。然后使用protectionLevel通过Calendar c = Calendar.getInstance();
c.set(2010, 1, 1, 12, 00, 00);
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
am.setTime(c.getTimeInMillis());
和方法AlarmManager
。
用于将活动或服务的时间设置为2010/1/1 12:00:00的代码段:
android.permission.SET_TIME_ZONE
如果要更改时区,则方法应非常相似(请参阅system
和setTime()
)
正如在多个线程中指出的那样,只有SystemClock.setCurrentTimeMillis()
用户可以更改系统时间。这只是故事的一半。 /dev/alarm
直接写入system
,system
是SystemClock
拥有的设备文件,缺少全球可写权限。换句话说,只有以system
运行的进程才能使用system_server
方法。对于这种方式,android权限无关紧要,没有涉及实体来检查适当的权限。
这是内部预安装的设置应用程序的工作方式。它只在system
用户帐户下运行。
镇上所有其他孩子都有闹钟管理员。这是一个在setTime
进程中运行的系统服务 - 猜测 - SET_TIME
用户帐户。它公开了所提到的SystemClock.setCurrentTimeMillis
方法,但强制执行{{1}}权限,并在内部调用{{1}}(由于警报管理器正在运行的用户而成功)。
~~~干杯
答案 1 :(得分:21)
根据this thread,用户应用无法设置时间,无论我们提供的权限如何。相反,最好的方法是make the user set the time manually。我们将使用:
startActivity(new Intent(android.provider.Settings.ACTION_DATE_SETTINGS));
不幸的是,没有办法将它们直接链接到时间设置(这样可以再次点击它们)。通过使用ellapsedRealtime,我们可以确保用户正确设置时间。
答案 2 :(得分:12)
根设备的解决方案可以执行命令
您可以使用以下方法通过代码执行此操作:
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");
答案 3 :(得分:3)
我在列表中没有看到这个,但它对我有用。我的设备是root用户,我安装了超级用户,但如果超级用户在非root用户设备上工作,这可能会有效。我使用了AsyncTask并调用了以下内容:
protected String doInBackground(String... params){
Runtime.getRuntime().exec("su && date -s " + params[0]);}
答案 4 :(得分:1)
在我们的应用案例中,脏的解决方法是:
当用户连接到Internet时,我们获得Internet时间(NTP服务器)并比较内部设备时间(registederOffsetFromInternetTime)的差异( - )。我们将其保存在用户的配置记录文件中。
我们使用devide + registederOffsetFromInternetTime的时间来考虑我们应用程序的正确更新时间。
所有GETHOUR流程都会检查实际时间与上次比较时间(使用互联网时间)之间的差异。如果时间超过10分钟,请进行新的比较以更新registederOffsetFromInternetTime并保持准确性。
如果用户使用没有Internet的应用程序,我们只能使用存储为参考的registederOffsetFromInternetTime,并使用它。只要用户在离线时更改本地设备中的小时并使用该应用程序,该应用程序将考虑不正确的时间。但是当用户回到互联网访问时,我们警告他关于时钟的变化,要求重新同步所有或拒绝更新,并且在不正确的时间内离线。
答案 5 :(得分:-2)
感谢企鹅。在quickshortcutmaker中,我准确地记下了日期/时间设置活动的名称。所以要开始系统时间设置:
Intent intent=new Intent();
intent.setComponent(new ComponentName("com.android.settings",
"com.android.settings.DateTimeSettingsSetupWizard"));
startActivity(intent);
`