【问题标题】:How to wipe Android device when device admin is deactivated?停用设备管理员后如何擦除 Android 设备?
【发布时间】:2012-03-07 02:07:44
【问题描述】:

在我的设备管理员应用程序中,当用户尝试停用应用程序的管理员功能时,我需要擦除整个设备。当用户进入设置/安全/设备管理员并停用管理应用程序时,首先会出现一个对话框“您要停用吗”。如果用户说“是”,则会出现另一个小对话框,其中包含应用程序的 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);
 }      
}

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

看来Android系统做了以下事情:

  • 向 AdminReceiver 发送 ACTION_DEVICE_ADMIN_DISABLE_REQUESTED

  • 不管管理员应用想要做什么,都继续禁用管理员

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

到目前为止,唯一的解决方案是在用户想要禁用管理应用程序时立即擦除而无需确认。换句话说,我可以立即在 onDisableRequested() 中调用 getManager().wipeData()。那时,管理员仍然处于活动状态,并且可以正常工作。

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

【问题讨论】:

  • 我发现尝试在 onDisableRequested() 或 onDisable() 中进行wipeData() 调用会使事情处于不稳定状态,如果屏幕关闭,数据擦除将失败。你有什么进一步的运气吗?
  • 如果屏幕关闭,数据擦除能否成功?我们没有对此进行测试。 (我们将设备更改为 Android 3.2,我们可以在 onDisabled 中执行操作。)
  • 如果我从 onDisableRequested() 启动 AsyncTask,我就能让它工作。我认为无论调用 onDisableRequested() 时正在执行什么线程,都无法在此处可靠地进行wipeData() 调用。当我从 AsyncTask 触发它时,我看到 PowerOff 对话框几乎立即出现。
  • onDisableRequested 在用户请求禁用管理员时调用,因为收到 ACTION_DEVICE_ADMIN_DISABLE_REQUESTED,让您有机会向他们显示警告消息。---我认为该消息由 onDisableRequested 返回是警告用户的最后机会,如果用户按“是”确认禁用设备管理员,则擦除设备。

标签: android admin


【解决方案1】:

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

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

【讨论】:

  • 这听起来像是一个解决方案。您应该接受自己的答案作为解决方案。这也将对其他人有所帮助,因为这样您的问题将作为已解决的问题呈现给其他人,因此对于那些在类似问题上寻求解决方案的人来说更有趣。
【解决方案2】:

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

但是。在onDisableRequested() 中,您可以将startActivity 用于主屏幕,然后将startActivity 用于您创建的Activity,以确认他们是否要继续。如果他们选择“是”,那么您就随心所欲(擦拭设备),如果他们说“不”,那么只需 startActivity 再次进入主屏幕(或 finish())。

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

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

如果您还有其他问题,请告诉我。我希望这会有所帮助。

编辑:我得到了一个支持,提醒我这个答案是存在的,所以我想我会添加一些信息。

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

如果在分布式应用程序上(通过应用程序商店)执行此类操作,请注意不要违反他们的政策,因为违反政策可能会导致应用程序商店被永久禁止(我在 Google Play 上遇到过这种情况,因为无非是误会。)

【讨论】:

  • - 这是一个“类似公司的东西” :) 擦除设备需要应用程序。 - 我已经尝试过开始一项新活动;但用户可以随时按“返回”并摆脱它,然后禁用管理员而不做任何事情。 - 如果我想重置密码和锁定,我需要成为一个活跃的管理员,所以我不能再次显示确认对话框后这样做。
  • - 我会尝试看看如果我强制启动初始设置页面会发生什么。
  • 当我建议使用 locknow 时,我的意思是在将对话框显示为部分解决方案之前,以防您不只是想在没有确认的情况下擦除 - 您会改为锁定,然后可能是主管或其他任何人密码。如果您能找到清除最近应用的方法(长按 home),那么您可以启动 home Activity 并设置好,但我认为没有任何合法的方法可以清除最近的应用。
猜你喜欢
  • 2012-05-21
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 2013-11-23
  • 1970-01-01
  • 2016-03-12
相关资源
最近更新 更多