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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:14:59