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 上向现有设备管理员添加新的使用策略

Java 安全管理器的使用

Android应用程序有没有办法授予另一个应用程序访问其存储的权限?

有没有办法使用 ADB 命令而不是设备策略管理器将应用程序列入锁定任务模式的白名单?

如何在 Android 设备管理器中重命名设备