You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio开发root设备无需UI修改系统时间的代码纠错求助

已Root Android设备无UI修改系统时间修复方案

原代码存在的问题

  • 直接调用系统TimeManager.setTime()需要android.permission.SET_TIME权限,该权限仅对系统签名应用开放,普通应用即使设备已Root也无法直接调用该接口完成时间修改
  • 未添加异常捕获和执行结果判断,修改失败后无法感知问题原因
  • 未关闭系统自动时间同步,即使修改成功也会很快被系统同步回正确时间

修复方案实现

Root设备可通过执行Shell命令完成时间修改,无需申请系统级权限,具体实现如下:

1. 新增Root命令执行工具方法

public boolean execRootCommand(String command) {
    Process process = null;
    DataOutputStream outputStream = null;
    try {
        // 获取Root权限
        process = Runtime.getRuntime().exec("su");
        outputStream = new DataOutputStream(process.getOutputStream());
        // 写入待执行命令
        outputStream.writeBytes(command + "\n");
        outputStream.writeBytes("exit\n");
        outputStream.flush();
        // 等待命令执行完成
        process.waitFor();
        return process.exitValue() == 0;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        try {
            if (outputStream != null) {
                outputStream.close();
            }
            if (process != null) {
                process.destroy();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. 修正后的MainActivity代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn_open = findViewById(R.id.btn_startxk);

    btn_open.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // 打印当前时间
            SimpleDateFormat showFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Calendar cal = Calendar.getInstance();
            String curTime = showFormat.format(cal.getTime());
            Toast.makeText(MainActivity.this, "当前时间:" + curTime, Toast.LENGTH_LONG).show();

            // 关闭系统自动时间、自动时区同步,避免修改后被重置
            execRootCommand("settings put global auto_time 0");
            execRootCommand("settings put global auto_time_zone 0");

            // 自定义修改后的时间:此处示例为设置为当天10点整,可按需调整小时数值实现前后偏移
            cal.set(Calendar.MILLISECOND, 0);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.HOUR_OF_DAY, 10);
            
            // 格式化Shell命令要求的时间格式 yyyyMMdd.HHmmss
            SimpleDateFormat shellFormat = new SimpleDateFormat("yyyyMMdd.HHmmss");
            String targetTime = shellFormat.format(cal.getTime());
            
            // 执行修改时间命令
            boolean modifyResult = execRootCommand("date -s " + targetTime);
            if (modifyResult) {
                Toast.makeText(MainActivity.this, "时间修改成功", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "时间修改失败,请确认设备已正常获取Root权限", Toast.LENGTH_SHORT).show();
            }
        }
    });
}

注意事项

  • 该方案仅适用于已获取Root权限的Android设备,未Root设备无法执行su命令完成修改
  • 部分定制ROM或高版本Android系统的date命令参数可能存在差异,如执行失败可根据设备实际Shell环境调整date命令的参数格式
  • 如需同步修改时区,可执行命令setprop persist.sys.timezone "Asia/Shanghai",将时区值替换为目标时区即可

内容的提问来源于stack exchange,提问作者BBMM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:18:00