在我的应用程序中,这是一个设备管理员,当用户试图停用应用程序的管理功能时,我需要擦除整个设备。当用户转到设置/安全/设备管理员并停用管理应用程序时,首先会出现一个对话框“您要停用”。如果用户说“是”,则显示另一个小对话框,应用程序的AdminReceiver在onDisableRequested()中提供文本。如果用户说“是”,我想擦拭整个设备。如何做到这一点?如何在设备管理员停用时擦除Android设备?
我试了一切,搜索了很长时间的答案,发现没有真正的解决方案。
我试了一下:
AdminReceiver具有功能禁止接通()。我试图擦除该功能中的设备。但是,看起来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系统将执行以下操作:
发送ACTION_DEVICE_ADMIN_DISABLE_REQUESTED到AdminReceiver
继续与不管的管理应用程序想要做什么禁用管理员
如果用户取消禁用,则罚款;如果没有,该应用程序被禁用。应用程序无法拒绝被禁用,或在禁用时执行设备擦除。
到目前为止唯一的解决方案是在用户想要禁用管理应用程序时立即擦除,而无需确认。换句话说,我可以立即在onDisableRequested()中调用getManager().wipeData()。在那个时候,管理员仍然活跃,这是有效的。
这是正确的吗?如何在用户选择禁用管理应用程序时擦除设备?
2012-02-15
winitzki
+0
我发现尝试在onDisableRequested()或onDisable()中执行wipeData()调用会使事物处于不稳定状态,并且如果屏幕关闭,则数据擦除失败。你有没有进一步的运气呢? –
2012-11-26 19:33:51
+0
如果屏幕关闭,数据擦除能否成功?我们没有测试这个。 (我们将设备更改为Android 3.2,我们可以在onDisabled中执行此操作。) –
2012-11-27 10:52:02
+0
如果我从onDisableRequested()启动了AsyncTask,我就可以使其运行。我认为,无论调用onDisableRequested()时执行什么线程,都无法可靠地在此处执行wipeData()调用。当我从AsyncTask中解雇它时,我发现几乎立即出现PowerOff对话框。 –
2012-11-27 12:46:07