以编程方式设置系统时间

时间:2017-11-22 14:47:15

标签: java android date time programmatically

我意识到这个问题出现在SO的其他地方,但是我已经尝试了我可以在网站上找到的所有解决方案,但仍然遇到困难。这些问题(以及他们的答案)也已经存在了几年,而不是评论旧问题,我认为我会在这里为其他人整合信息,并调查当时和现在之间Android的潜在相关变化。尽管如此,如果您认为此问题符合重复条件,请将其标记为。

编辑:正如我所说的那样,关于SO的其他答案并没有解决问题。我不知道如何评论每一个可能的解决方案"没有"为我工作"有助于帮助自己和他人解决问题,但如果是这样,那就这样吧。作为参考,有3人将这些问题标记为this question的潜在副本,因此我将这些非工作答案添加到下面的列表中。

我的应用程序有一些非常具体的需求,但为了简洁起见,我们假设我需要手动将系统时间和日期设置为固定值。下面我详细介绍了我在尝试实现这一目标方面取得的进展。

该应用程序的最低SDK版本为,目标为24.其他人发现他们需要将版本增加到此级别。

设备已植根,应用程序正在安装到/ system / app,以便我可以更改日期/时间。

有些人评论说应用程序设置时间是不可能的,但是看看像ClockSync这样的应用程序,情况似乎并非如此。我知道我的应用程序将无法在Play商店中使用。

应用程序必须在没有用户输入的情况下自动设置日期/时间,因此使用以下代码使用户设置它将无济于事;

startActivity(new Intent(android.provider.Settings.ACTION_DATE_SETTINGS));

我以两种方式为清单添加了设置时间权限,单独使用,然后一起使用。我还尝试添加关于删除maxSDKversion的部分。

<uses-permission android:name="android.permission.SET_TIME" tools:remove="android:maxSdkVersion" />

<permission android:name="android.permission.SET_TIME"
    android:protectionLevel="signature|system"/>

我读过某些权限不仅需要清单条目,还需要用户接受并允许它们。但是,SET_TIME未列在这些中。无论如何我确实尝试过这样做,但是我的权限请求被自动拒绝而没有显示确认框,可能是因为它实际上并没有首先要求

我用来尝试设置时间的代码如下:

try {
        Calendar c = Calendar.getInstance();
        c.set(2017, 11, 21, 12, 32, 30);
        AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        am.setTime(c.getTimeInMillis());
    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
    }

此失败时我在Toast中收到的错误是:

java.lang.securityexception: setTime: neither user 10051 nor current process has android.permission.SET_TIME

我在上面的编辑中引用的问题中尝试了两个解决方案,这两个解决方案都涉及运行代码来设置日期:

Runtime.getRuntime().exec("su && date -s 20171122.153720");}

这两个答案都没有做任何事情 - 时间不会改变,也不会抛出任何异常。另一个答案需要访问互联网,这超出了我的问题范围。

考虑到上述所有问题,是否有任何关键步骤我在进行此项工作时遗漏,或者代码中的任何表示问题的任何内容?

2 个答案:

答案 0 :(得分:1)

如果您需要设置第二个,请使用以下格式:MMddhhmmyy.ss

如果您的时间很长,请使用以下方法:

SimpleDateFormat dateFormat = new SimpleDateFormat("MMddhhmmyy.ss");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeValue);
Date date = calendar.getTime();

Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());

String command = "date " + dateFormat.format(date)  + "\n";

os.writeBytes(command);
os.flush();
os.writeBytes("exit\n");
os.flush();
process.waitFor();

答案 1 :(得分:0)

事实证明,答案确实位于引用的问题found here中。但是,Android 7(可能还有6个,我还没有测试过)设备的命令不同。我没有在那里发表评论的声誉,所以如果有人希望在这个问题上粘贴/引用这个答案,那么就去吧。

我使用的日期代码格式为MMddhhmmyy,而不是yyyyMMdd.hhmmss;这适用于Android 7.我还删除了附加的&#39; -s&#39;。我用来设置系统时间的完整工作代码如下。同样需要注意的是,这需要对设备进行生根,因此仅在我的某些场景中有用。

     try {

        Process process = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream());
        String command = "date 1123104017\n";
        // Log.e("command",command);
        os.writeBytes(command);
        os.flush();
        os.writeBytes("exit\n");
        os.flush();
        process.waitFor();

    } catch (InterruptedException e) {
        Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
    }

为清楚起见,我输入的日期是2017年11月23日上午10:40。