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

win*_*zki 11 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);
 }      
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 将ACTION_DEVICE_ADMIN_DISABLE_REQUESTED发送到AdminReceiver

  • 无论管理员应用程序想要执行什么操作,都要禁用管理员

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

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

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

Ree*_*eed 5

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

但。在 中onDisableRequested(),您可以startActivity选择主屏幕,然后startActivity选择Activity您创建的确认他们是否要继续的屏幕。如果他们选择“是”,则您可以按照自己的意愿进行操作(擦除设备),如果他们说“否”,则只需startActivity再次返回主屏幕(或finish())。

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

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

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

编辑:我得到了一个赞成票,提醒我这个答案存在,所以我想我应该添加一些信息。

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

如果在分布式应用程序(通过应用程序商店)上执行类似的操作,请注意不要违反他们的政策,因为违反政策可能会导致应用程序商店永久禁止(我在 Google Play 上发生过这种情况,原因不外乎一个误会。)


win*_*zki 4

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

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