Android:使用设备策略管理器授予SET_TIME权限作为设备所有者

问题描述

我正在开发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,表示它无法授予权限。

如何在不提示用户向我的应用程序授予此权限的情况下解决此问题。

解决方法

如果您定位的设备是api 28+(Android 9及更高版本),则可以使用setTime(ComponentName admin,long millis)函数对其进行设置。

对于较低的android版本,我必须依靠设备制造商api来设置设备时间。

Manifest.permission.SET_TIME是受保护的/系统权限,可惜deviceOwner无法使用setPermissionGrantState()功能授予任何受保护的权限。 其文档中有一个非常重要的词:

设置特定应用程序的!runtime!权限的授予状态。