Android无需跳转设置页面修改设备时间与日期的实现方案
Android 无需跳转设置页修改系统时间/日期方案
核心前提:权限限制
Android系统对修改系统时间有严格的安全管控,必须满足以下任一条件才能实现:
- 应用为系统应用(签名与设备系统一致),且声明
android.permission.SET_TIME和android.permission.SET_TIME_ZONE权限 - 设备已Root,应用可获取Root权限执行Shell命令
普通第三方应用(非系统、未Root)无法直接修改系统时间,这是系统安全机制决定的,并非代码实现问题。
实现步骤(满足权限条件时)
1. 声明权限
在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.SET_TIME" /> <uses-permission android:name="android.permission.SET_TIME_ZONE" />
注意:普通应用即使声明该权限,安装时也无法获取,只有系统应用或Root环境下才能生效。
2. 结合选择器完成时间/日期修改
日期选择与设置示例(Kotlin)
DatePickerDialog(this, { _, year, month, dayOfMonth -> val calendar = Calendar.getInstance().apply { set(Calendar.YEAR, year) set(Calendar.MONTH, month) set(Calendar.DAY_OF_MONTH, dayOfMonth) } val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmManager.setTime(calendar.timeInMillis) } else { // 低版本通过反射调用 try { val method = alarmManager.javaClass.getMethod("setTime", Long::class.java) method.invoke(alarmManager, calendar.timeInMillis) } catch (e: Exception) { e.printStackTrace() } } }, Calendar.getInstance().get(Calendar.YEAR), Calendar.getInstance().get(Calendar.MONTH), Calendar.getInstance().get(Calendar.DAY_OF_MONTH) ).show()
时间选择与设置示例(Kotlin)
TimePickerDialog(this, { _, hourOfDay, minute -> val calendar = Calendar.getInstance().apply { set(Calendar.HOUR_OF_DAY, hourOfDay) set(Calendar.MINUTE, minute) set(Calendar.SECOND, 0) } val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmManager.setTime(calendar.timeInMillis) } else { try { val method = alarmManager.javaClass.getMethod("setTime", Long::class.java) method.invoke(alarmManager, calendar.timeInMillis) } catch (e: Exception) { e.printStackTrace() } } }, Calendar.getInstance().get(Calendar.HOUR_OF_DAY), Calendar.getInstance().get(Calendar.MINUTE), true ).show()
3. Root设备下的备选方案(非系统应用)
如果设备已Root,可通过执行Shell命令修改时间:
// 示例:设置日期为2024-05-20,时间为14:30:00 val command = "date -s '20240520 14:30:00'" try { Runtime.getRuntime().exec(arrayOf("su", "-c", command)) } catch (e: IOException) { e.printStackTrace() }
关键说明
- DatePickerDialog/TimePickerDialog仅提供时间选择界面,本身不具备修改系统时间的能力,必须结合权限和上述代码逻辑才能完成设置。
- 若你开发的是普通第三方应用,没有系统签名或Root权限,无法绕过系统限制直接修改时间,只能引导用户跳转系统设置页(
Intent(Settings.ACTION_DATE_SETTINGS)),这是Android的安全设计,没有其他可行方案。
内容的提问来源于stack exchange,提问作者R_P
相关产品推荐
相关产品推荐

