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

时间:2009-08-26 04:06:14

标签: android operating-system

如果您想更改应用程序中的移动系统日期或时间,您将如何进行此操作?

6 个答案:

答案 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

如果要更改时区,则方法应非常相似(请参阅systemsetTime()

长答案

正如在多个线程中指出的那样,只有SystemClock.setCurrentTimeMillis()用户可以更改系统时间。这只是故事的一半。 /dev/alarm直接写入systemsystemSystemClock拥有的设备文件,缺少全球可写权限。换句话说,只有以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)

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

  • date -s YYYYMMDD.HHMMSS

Change date on 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");

答案 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);

`