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

已签名Android应用获取SET_TIME权限失败,设置系统时间报错如何解决

问题根因

  1. 运行时权限申请逻辑无效:ActivityCompat.RequestPermissions是Android为普通危险权限(比如读写日历、定位、存储等)设计的申请逻辑,SET_TIME属于signatureOrSystem级别的特殊权限,根本不支持运行时申请,写了这部分代码也不会有任何效果。
  2. 权限获取条件未满足:signatureOrSystem级别的权限需要满足任意一个条件才能自动获得:①应用签名和当前设备的系统固件签名完全一致;②应用被预安装在系统的特权目录/system/priv-app下。你使用的第三方应用签名和系统固件签名不一致,也没有将应用放到系统特权目录,所以哪怕在Manifest里声明了权限,也没法真正获得。

可行修复方案

场景1:可拿到系统平台签名/可做系统内置应用

  • 删掉所有SET_TIME相关的运行时权限申请代码,直接用系统平台签名对你的应用进行打包签名,安装后会自动获得SET_TIME权限,原有修改时间的代码可正常运行。
  • 也可以将应用打包进系统固件,放到/system/priv-app目录下,同时在Manifest里声明权限,同样可以自动获取权限。

场景2:普通三方应用,无系统签名

这种场景下无法实现静默修改系统时间,可选择两种替代方案:

  1. 引导用户跳转到系统时间设置页面手动调整:
Intent intent = new Intent(Android.Provider.Settings.ActionDateSettings);
StartActivity(intent);
  1. 针对Root设备,通过执行Shell命令修改时间:
try {
    Process process = Runtime.GetRuntime().Exec("su");
    StreamWriter outputStream = new StreamWriter(process.OutputStream);
    // 命令格式:date -s YYYYMMDD.HHmmss
    string command = $"date -s {_time.ToString("yyyyMMdd.HHmmss")}";
    outputStream.Write(command);
    outputStream.Flush();
    outputStream.Close();
    process.WaitFor();
} catch (IOException ex) {
    // 处理设备未Root等异常情况
}

需求可行性说明

  • 如果你有系统签名权限/可以做系统内置应用:需求可完全实现,按场景1的方案调整即可。
  • 如果你是面向普通用户的三方应用,无法拿到系统签名:无法实现静默修改系统时间,只能用场景2的替代方案实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 17:30:01