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

42 android operating-system

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

jek*_*jek 64

您无法使用普通的现成手机,因为无法获得SET_TIME权限.此权限拥有的ProtectionLevelsignatureOrSystem,所以没有办法对市场的应用程序更改全局系统时间(但也许有黑色vodoo魔法我还不知道).

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

如果您可以获得许可,或者因为您拥有手机,或者构建并签署了自己的平台图像,请继续阅读.

简答

这是可能的,并已完成.你需要android.permission.SET_TIME.然后使用AlarmManagervia Context.getSystemService(Context.ALARM_SERVICE)和它的方法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());
Run Code Online (Sandbox Code Playgroud)

如果要更改时区,则方法应该非常相似(请参阅android.permission.SET_TIME_ZONEsetTimeZone)

答案很长

正如在多个线程中指出的那样,只有system用户才能更改系统时间.这只是故事的一半.SystemClock.setCurrentTimeMillis()直接写入缺少世界可写权限/dev/alarm所拥有的设备文件system.换句话说,只有运行的进程system可以使用该SystemClock方法.对于这种方式,android权限无关紧要,没有涉及实体检查适当的权限.

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

对于镇上的所有其他孩子,都有警报管理员.这是一个系统服务,在system_server- 猜测什么 - system用户帐户下运行.它公开了上述setTime方法,但强制执行SET_TIME权限,反过来只是SystemClock.setCurrentTimeMillis内部调用(由于警报管理器正在运行的用户而成功).

~~~干杯


Cas*_*ash 21

根据这个帖子,无论我们提供什么权限,用户应用程序都无法设置时间.相反,最好的方法是让用户手动设置时间.我们将使用:

startActivity(new Intent(android.provider.Settings.ACTION_DATE_SETTINGS));
Run Code Online (Sandbox Code Playgroud)

不幸的是,没有办法将它们直接链接到时间设置(这将节省他们一次点击).通过使用ellapsedRealtime,我们可以确保用户正确设置时间.


Led*_*ine 14

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

  • date -s YYYYMMDD.HHMMSS

更改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();
    }
}
Run Code Online (Sandbox Code Playgroud)

只需调用上一个方法,如下所示:

changeSystemTime("2015","04","06","13","09","30");
Run Code Online (Sandbox Code Playgroud)

  • 如何设置时区? (2认同)