以编程方式设置系统时间

Alt*_*iew 5 java time android date programmatically

我意识到这个问题出现在 SO 的其他地方,但是我已经尝试了我可以在网站上找到的所有解决方案,但仍然遇到困难。这些问题(和他们的回答)也已经有好几年了,与其对旧问题发表评论,我想我会在这里为其他人整合信息,并调查从那时到现在与 Android 相关的潜在变化。不过,如果您觉得这个问题有资格作为重复,请将其标记为重复。

编辑:正如我所说,关于 SO 的其他答案并没有解决问题。我不明白用“对我不起作用”来评论每一个潜在的修复如何有助于帮助自己和其他人解决问题,但如果是这样,那就这样吧。作为参考,有 3 个人将这些问题标记为可能与此问题重复,因此我将这些无效的答案添加到下面的列表中。

我的应用程序有一些非常具体的需求,但为了简洁起见,让我们假设我需要手动将系统时间和日期设置为固定值。下面我详细说明了我在尝试使其工作的过程中取得的一些进展。

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

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

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

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

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

我以两种方式将设置时间权限添加到清单中,单独添加,然后一起添加。我还尝试添加有关删除 maxSDKversion 的部分。

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

<permission android:name="android.permission.SET_TIME"
    android:protectionLevel="signature|system"/>
Run Code Online (Sandbox Code Playgroud)

我读过某些权限不仅需要清单条目,还需要用户接受和允许它们。但是,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();
    }
Run Code Online (Sandbox Code Playgroud)

失败时我在祝酒中收到的错误是:

java.lang.securityexception: setTime: neither user 10051 nor current process has android.permission.SET_TIME
Run Code Online (Sandbox Code Playgroud)

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

Runtime.getRuntime().exec("su && date -s 20171122.153720");}
Run Code Online (Sandbox Code Playgroud)

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

考虑到上述所有内容,我在完成这项工作时是否遗漏了任何关键步骤,或者代码中是否有任何表明存在问题的内容?

Alt*_*iew 2

事实证明,答案确实存在于此处找到的引用问题中。但是,对于 Android 7(可能还有 6,我尚未测试)设备,该命令有所不同。我没有在那里评论的声誉,所以如果有人希望粘贴/引用该问题的答案,请继续。

我使用的日期代码的格式为 MMddhhmmyy,而不是 yyyyMMdd.hhmmss;这适用于 Android 7。我还删除了附加的“-s”。我用来设置系统时间的完整工作代码如下。再次值得注意的是,这需要对设备进行 root,因此仅在像我这样的某些情况下有用。

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

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