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
相关产品推荐
相关产品推荐

