安卓 - 受密码保护的设备管理员禁用

4

以下是问题:

我正在尝试创建一个设备管理员应用程序,当用户尝试禁用应用程序的管理员功能时,会提示输入密码,如果用户未能输入正确的密码,则应用程序将保留管理员权限。

我见过一个叫做AppLock的应用程序就是这样做的,而且它很好用!我已经尝试从onDisableRequested()方法锁定屏幕,如这个SO问题建议的那样,但管理员应用程序仍然被禁用。

我假设当用户尝试禁用应用程序作为管理员时,AppLock使用密码活动锁定屏幕,但我不明白它如何阻止应用程序在密码错误时被禁用,因为当启动密码活动时,应用程序已经在被禁用的过程中了。是否有钩子可以在密码不正确时停止某些进程?

我还困惑于如何实现AppLock所使用的自定义密码锁屏。我如何暂时更改锁屏类型以使用自定义密码锁屏,然后恢复到用户的原始锁屏类型?

以下是一些类似于我的问题的SO问题:


嗨,你有找到任何解决方法吗? - pavanmvn
2
是的,我想出了一些技巧,使其在大多数情况下都能正常工作,尽管仍然有一些需要解决的错误。最重要的部分是,你需要使用后台服务来观察顶部活动,并在适当时激活密码活动,而不是使用“onDisableRequested()”方法作为密码活动的触发器。 - Garrison_Laforge
你能分享一下实现这个的示例源代码吗? - Wasi Sadman
1个回答

2
几年后,我遇到了同样的问题并解决了它。也许原帖的作者不需要答案,但其他人——例如我——在寻找解决方法时可能会偶然发现这个帖子。
请注意,此方法仅在用户无法解锁屏幕时才有效。
您只需在DeviceAdminReceiver的onDisableRequested方法中锁定屏幕,以便用户必须输入密码才能解锁。当然,这仅适用于手机有某种形式的屏幕锁(如PIN码、密码、指纹等)。请注意智能锁。
请记住,此方法旨在显示警告,解释为什么用户不应禁用权限。如果返回null(来自super的默认值),则不会显示任何内容,并且权限将被禁用。因此,如果我们返回任何文本,则将显示一个对话框,其中包含该文本以及确定和取消按钮。
如果按照以下方式与屏幕锁结合使用:
public CharSequence onDisableRequested(Context context, Intent intent) {
    DevicePolicyManager deviceManger = (DevicePolicyManager)context.getSystemService(
            Context.DEVICE_POLICY_SERVICE);
    deviceManger.lockNow();
    return "Your warning";
}

当用户尝试禁用权限时,屏幕会关闭,当他们解锁屏幕时,需要输入密码。一旦他们这样做了,就会看到一个带有“你的警告”的对话框,一个取消按钮和一个确定按钮。只有当他们按下确定按钮后,权限才会被禁用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接