已签名Android应用获取SET_TIME权限失败,设置系统时间报错如何解决
问题根因
- 运行时权限申请逻辑无效:
ActivityCompat.RequestPermissions是Android为普通危险权限(比如读写日历、定位、存储等)设计的申请逻辑,SET_TIME属于signatureOrSystem级别的特殊权限,根本不支持运行时申请,写了这部分代码也不会有任何效果。 - 权限获取条件未满足:
signatureOrSystem级别的权限需要满足任意一个条件才能自动获得:①应用签名和当前设备的系统固件签名完全一致;②应用被预安装在系统的特权目录/system/priv-app下。你使用的第三方应用签名和系统固件签名不一致,也没有将应用放到系统特权目录,所以哪怕在Manifest里声明了权限,也没法真正获得。
可行修复方案
场景1:可拿到系统平台签名/可做系统内置应用
- 删掉所有
SET_TIME相关的运行时权限申请代码,直接用系统平台签名对你的应用进行打包签名,安装后会自动获得SET_TIME权限,原有修改时间的代码可正常运行。 - 也可以将应用打包进系统固件,放到
/system/priv-app目录下,同时在Manifest里声明权限,同样可以自动获取权限。
场景2:普通三方应用,无系统签名
这种场景下无法实现静默修改系统时间,可选择两种替代方案:
- 引导用户跳转到系统时间设置页面手动调整:
Intent intent = new Intent(Android.Provider.Settings.ActionDateSettings); StartActivity(intent);
- 针对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
相关产品推荐
相关产品推荐

