如何在无网络的已Root Android 4.2设备上通过代码设置时间日期
解决已Root Android 4.2设备无网时自定义设置日期时间的方案
因为设备已Root且无网络,直接通过系统API设置时间会受限,所以采用执行Root Shell命令的方式实现,可在应用启动阶段完成设置。
核心思路
利用Android系统内置的date命令(Android 4.2支持该命令),通过Root权限执行命令修改系统时间,同时通知系统时间已更新。
具体实现步骤
1. 编写Root命令执行工具类
先封装一个执行Root命令的工具方法,确保能获取Root权限并执行命令:
public class RootCommandUtil { public static boolean executeRootCommand(String command) { Process process = null; DataOutputStream os = null; try { // 启动Root权限的Shell进程 process = Runtime.getRuntime().exec("su"); os = new DataOutputStream(process.getOutputStream()); // 写入命令并执行 os.writeBytes(command + "\n"); os.writeBytes("exit\n"); os.flush(); // 等待命令执行完成,返回0表示成功 return process.waitFor() == 0; } catch (Exception e) { e.printStackTrace(); return false; } finally { try { if (os != null) os.close(); if (process != null) process.destroy(); } catch (IOException e) { e.printStackTrace(); } } } }
2. 构造时间设置命令
Android的date命令格式为:date MMDDhhmm[[CC]YY][.ss],各参数含义:
- MM:月份(01-12)
- DD:日期(01-31)
- hh:小时(00-23)
- mm:分钟(00-59)
- YY/CCYY:年份(可写后两位或四位)
- ss:秒数(可选,默认00)
示例:设置2024年5月20日14点30分00秒,命令为:
date 052014302024.00
3. 在应用启动前执行设置
可以在自定义Application的onCreate方法中执行,确保业务代码启动前完成时间设置:
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); // 自定义目标时间,这里可以替换为固定时间或从本地存储读取 String setTimeCommand = "date 052014302024.00"; boolean isSuccess = RootCommandUtil.executeRootCommand(setTimeCommand); if (isSuccess) { // 通知系统时间已更改,更新系统时间显示 sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED)); } } }
记得在AndroidManifest.xml中注册自定义Application:
<application android:name=".MyApp" ...> ... </application>
注意事项
- 确保设备已获取Root权限,且应用请求Root权限时用户已授权。
- 时间参数必须严格按照格式填写,否则命令执行失败。
- 若需要动态设置时间(比如从本地配置文件读取),可提前解析配置生成对应格式的命令字符串。
- Android 4.2中部分设备可能需要额外执行
setprop persist.sys.timezone GMT+8(根据时区调整)来设置时区,可按需添加到命令中。
内容的提问来源于stack exchange,提问作者Android_junior
相关产品推荐
相关产品推荐

