1

我是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()
                }
            }
        }
    }
4

0 回答 0