如何在停用设备管理员时擦除Android设备?

时间:2012-02-15 17:39:37

标签: android admin

在我的应用程序(设备管理员)中,当用户尝试停用应用程序的管理功能时,我需要擦除整个设备。当用户转到设置/安全/设备管理员并停用管理员应用程序时,首先会出现一个对话框“是否要取消激活”。如果用户说“是”,则会显示另一个小对话框,其中文本由应用程序的AdminReceiver在onDisableRequested()中提供。如果用户然后说“是”,我想擦除整个设备。如何做到这一点?

我尝试了一切,长期寻找答案,找不到真正的解决方案。

我尝试了什么:

  • AdminReceiver具有onDisable()函数。我试图在该功能中擦除设备。但是,似乎onDisable()在 之后被称为 ,管理员已被禁用。因此,应用程序根本无法使用wipeData()函数(抛出安全性异常)。我还验证了isAdminActive()在那时返回false。

官方文档没有明确说明,但似乎在调用onDisable()时管理员已被禁用。因此,我们必须在此之前擦除设备。

  • AdminReceiver有一个onDisableRequested()函数,它返回CharSequence。我试图在该功能中添加另一个警报框。这会崩溃,因为无法从非活动上下文调用警报框,这似乎是我们在onDisableRequested()时的情况。

  • AdminReceiver有一个onReceive()函数,可以在任何事件上调用它。在这个函数中,我们不再处于活动上下文中,也不能呈现我们自己的对话框。

  • 我尝试从onReceive()创建另一个活动。这有效;在onReceive()期间,当我们获得ACTION_DISABLE_ADMIN_REQUESTED时,管理员仍处于活动状态,我们可以擦除设备。但是,系统仍会显示自己的对话框,询问用户是否停用管理员。如果用户对我们的对话框拒绝,但系统对话框显示“是”,则管理员将被停用,我们将无法擦除设备。

我在DeviceAdminReceiver的子类中尝试了以下内容:

@Override
public void onReceive(Context context, Intent intent) {
 // detect whether disabling is requested?
 if (intent.getAction().equals(ACTION_DEVICE_ADMIN_DISABLE_REQUESTED)) {
            confirmWipeDevice(context);

 } else {
    super.onReceive(context, intent);
 }      
}

换句话说,如果操作是禁用admin,我不会调用super.onReceive()。函数confirmWipeDevice()使用对话框显示不同的活动。这不显示用于确认禁用我的管理员应用程序的系统对话框。但是,这并不妨碍应用程序实际被禁用!

似乎Android系统执行以下操作:

  • 将ACTION_DEVICE_ADMIN_DISABLE_REQUESTED发送至AdminReceiver

  • 无论管理员应该做什么,都要禁用管理员

  • 如果用户取消禁用,则罚款;如果没有,该应用程序被禁用。该应用无法拒绝被禁用,也无法在禁用时执行设备擦除。

到目前为止,唯一的解决方案是在用户想要禁用管理应用时立即擦除而不进行确认。换句话说,我可以在onDisableRequested()中立即调用getManager()。wipeData()。那时,管理员仍然处于活动状态,这是有效的。

这是对的吗?当用户选择禁用管理应用程序时如何擦除设备?

2 个答案:

答案 0 :(得分:4)

在Android 3.2中,他们已经解决了这个问题。在Android 3.1中,问题仍然存在。

现在(Android 3.2)onDisabled仍具有管理员权限,因此您可以擦除该设备。

答案 1 :(得分:3)

我的建议:不要这样做,除非它像公司类型的东西。

但是。在onDisableRequested()中,您可以startActivity用于主屏幕,然后startActivity用于您创建的Activity确认是否要继续。如果他们选择是,那么您可以按照自己的意愿(擦除设备),如果他们拒绝,那么只需再次startActivity主屏幕(或finish())。

这仍然存在他们可以从最近的任务启动相同设置页面的风险,在这种情况下,他们可能会在弹出自定义文本的对话框上按“是”(或确定),然后继续禁用设备管理员。为了避免这种情况发生,您可以执行this,希望它将启动初始设置页面并清除最顶层的禁用设备管理屏幕。

您可以随时resetPassword("new password")然后lockNow()而不是擦拭。如果它是与安全相关的应用程序,则不必擦除该人的设备,并且密码将由安装该应用程序的人预先定义。

如果您有任何其他问题,请与我们联系。我希望这会有所帮助。

编辑:我有一个upvote,提醒我这个答案存在,所以我想我会添加一些信息。

您可以将lockNow()与将在锁定屏幕顶部显示的活动结合使用,如果您想锁定,则仍然提供擦除或其他任何内容。
如果擦除因任何原因出现错误或延迟,在开始擦除之前锁定将是一个好主意,以防止出现问题。

如果在分布式应用程序(通过应用程序商店)上做这样的事情,请注意不要违反他们的政策,因为政策违规会导致应用程序商店永久禁止(在Google Play上发生的事情,由于我只不过是一种误解。)