Android:使用设备策略管理器授予 SET_TIME 权限作为设备所有者
Posted
技术标签:
【中文标题】Android:使用设备策略管理器授予 SET_TIME 权限作为设备所有者【英文标题】:Android: Granting SET_TIME permission as a Device Owner using Device Policy Manager 【发布时间】:2021-01-16 05:53:39 【问题描述】:我正在开发一个 COSU/KiosK 应用程序,我需要手动更新设备上的时间。
我正在使用 AlertManager.setTime(Calendar)
执行此操作,但我无法授予我的应用程序所需的 SET_TIME
权限。
应用程序是设备所有者,这允许我使用许多其他系统权限,例如
android:name="android.permission.REBOOT"
android:name="android.permission.SHUTDOWN"
android:name="android.permission.WRITE_SETTINGS"
android:name="android.permission.INSTALL_PACKAGES"
android:name="android.permission.DELETE_PACKAGES"
所有这些权限都授予了我的应用程序,只需将它们列在manifest.xml
但是SET_TIME
不起作用。
我也尝试使用设备策略管理器
mDevicePolicyManager.setPermissionGrantState(mAdminComponentName, getPreferredPackageName(),
Manifest.permission.SET_TIME, DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
此函数返回false
,表示它无法授予权限。
如何在不提示用户向我的应用程序授予此权限的情况下解决此问题。
【问题讨论】:
【参考方案1】:如果您的目标设备是 api 28+(android 9 和更高版本),您可以使用 setTime(ComponentName admin, long millis) 函数进行设置。
对于较低的 android 版本,我不得不依靠设备制造商的 api 来设置设备时间。
Manifest.permission.SET_TIME
是受保护/系统权限,遗憾的是 deviceOwner 无法通过setPermissionGrantState()
函数授予任何受保护权限。
它的文档中有一个非常重要的词:
为特定应用设置 !runtime! 权限的授予状态。
【讨论】:
遗憾的是,我的目标是较低的目标 API。我的困惑来自于我可以做其他也需要系统许可的事情,例如,我能够在运行时静默重新安装应用程序,而无需任何用户交互。设定一个新的时间比我能做的事情危险得多。 好吧,如果你是DeviceOwner,安装应用不需要系统权限以上是关于Android:使用设备策略管理器授予 SET_TIME 权限作为设备所有者的主要内容,如果未能解决你的问题,请参考以下文章
Android应用程序有没有办法授予另一个应用程序访问其存储的权限?