我是Android的初学者。我正在尝试制作一个可以在没有 root 的情况下在主要和次要用户之间切换用户的应用程序。
我发现DevicePolicyManager.switchUser对我来说很有用。
所以我用 adb 授予了我的应用设备所有者权限。当应用程序在主要用户中启动时,它会毫无问题地切换到次要用户。
但是,当应用程序在次用户中启动时,它不能再通过调用切换回主用户dpm.switchUser(admin, null)
,因为admin
不是设备所有者,这会引发 SecurityException。
我想知道这个问题的解决方法。谢谢你。
private fun switchUser() {
dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
admin = ComponentName(applicationContext, DevAdmRcvr::class.java)
// If device admin not active, take user to settings
if (!dpm.isAdminActive(admin)) {
val activateDeviceAdminIntent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN)
activateDeviceAdminIntent.putExtra(
DevicePolicyManager.EXTRA_DEVICE_ADMIN,
admin
)
activateDeviceAdminIntent.putExtra(
DevicePolicyManager.EXTRA_ADD_EXPLANATION,
resources.getString(R.string.device_admin_activation_message)
)
startActivityForResult(activateDeviceAdminIntent, 1)
return
}
if (dpm.isDeviceOwnerApp(admin.packageName)) { // Return false if app run as secondary user
val secondaryUsers = dpm.getSecondaryUsers(admin)
if (secondaryUsers.isNotEmpty()) { // Switch to secondary user
Log.i(TAG, "Switch to secondary")
dpm.switchUser(admin, secondaryUsers[0])
} else { // Create and switch to new user
Log.i(TAG, "Create new")
val identifiers = dpm.getAffiliationIds(admin)
if (identifiers.isEmpty()) {
identifiers.add(UUID.randomUUID().toString())
dpm.setAffiliationIds(admin, identifiers)
}
val adminExtras = PersistableBundle()
adminExtras.putString("AFFILIATION_ID_KEY", identifiers.first())
try {
val newUser = dpm.createAndManageUser(
admin,
"Foo",
admin,
adminExtras,
DevicePolicyManager.SKIP_SETUP_WIZARD
)
dpm.switchUser(admin, newUser)
} catch (e: Exception) {
Toast.makeText(applicationContext, R.string.creation_failed, Toast.LENGTH_SHORT)
.show()
}
}
}
}