在我的應用程序中,這是一個設備管理員,當用戶試圖停用應用程序的管理功能時,我需要擦除整個設備。當用戶轉到設置/安全/設備管理員並停用管理應用程序時,首先會出現一個對話框「您要停用」。如果用戶說「是」,則顯示另一個小對話框,應用程序的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()。在那個時候,管理員仍然活躍,這是有效的。
這是正確的嗎?如何在用戶選擇禁用管理應用程序時擦除設備?
我發現嘗試在onDisableRequested()或onDisable()中執行wipeData()調用會使事物處於不穩定狀態,並且如果屏幕關閉,則數據擦除失敗。你有沒有進一步的運氣呢? – 2012-11-26 19:33:51
如果屏幕關閉,數據擦除能否成功?我們沒有測試這個。 (我們將設備更改爲Android 3.2,我們可以在onDisabled中執行此操作。) – winitzki 2012-11-27 10:52:02
如果我從onDisableRequested()啓動了AsyncTask,我就可以使其運行。我認爲,無論調用onDisableRequested()時執行什麼線程,都無法可靠地在此處執行wipeData()調用。當我從AsyncTask中解僱它時,我發現幾乎立即出現PowerOff對話框。 – 2012-11-27 12:46:07