设备所有者应用调用setPermissionGrantState获取SET_TIME权限失败求助
解决设备所有者应用无法授予SET_TIME权限的问题
我之前开发设备所有者应用时也踩过这个坑,调用setPermissionGrantState尝试授予SET_TIME权限完全没效果,后来查了系统源码和官方文档才搞清楚问题所在,给你梳理几个关键点:
先明确
SET_TIME权限的特殊性:这个权限属于签名级权限(signature-level permission),和普通的危险权限不一样。设备所有者应用的权限管理能力只覆盖危险权限(比如相机、存储这类),对于签名级权限,系统要求应用必须和系统签名一致,或者是预装的系统应用,否则哪怕你是设备所有者,也没法通过setPermissionGrantState来授予它。确认设备所有者状态是否生效:先验证你的应用确实已经被激活为设备所有者,避免是因为这个前提不满足导致API失效。可以加一段代码检查:
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); boolean isDeviceOwner = dpm.isDeviceOwnerApp(getPackageName()); Log.d("DeviceOwner", "Is device owner: " + isDeviceOwner);如果返回
false,得先确保你的应用通过正确的方式(比如ADB命令dpm set-device-owner)激活了设备所有者身份。用设备所有者专属的时间设置API替代:其实设备所有者应用根本不需要
SET_TIME权限就能修改系统时间!系统专门提供了DevicePolicyManager.setTime()方法,这才是官方推荐的姿势,示例代码如下:DevicePolicyManager dpm = DeviceOwnerHelper.getInstance().getDevicePolicyManager(); ComponentName adminReceiver = new ComponentName(this, DeviceOwnerReceiver.class); // 先确认管理员组件处于活跃状态 if (dpm.isAdminActive(adminReceiver)) { // 设置为当前时间,替换成你需要的时间戳即可 long targetTime = System.currentTimeMillis(); dpm.setTime(adminReceiver, targetTime); }这个方法不需要任何权限申请,只要你的应用是设备所有者就能直接调用,完全能满足修改系统时间的需求。
总结一下:别再纠结授予SET_TIME权限了,直接用setTime()方法就行,这是系统为设备所有者应用量身打造的功能。
内容的提问来源于stack exchange,提问作者Antonio Vlasic
相关产品推荐
相关产品推荐

