【发布时间】: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 返回是警告用户的最后机会,如果用户按“是”确认禁用设备管理员,则擦除设备。