2012-02-15 158 views
11

在我的應用程序中,這是一個設備管理員,當用戶試圖停用應用程序的管理功能時,我需要擦除整個設備。當用戶轉到設置/安全/設備管理員並停用管理應用程序時,首先會出現一個對話框「您要停用」。如果用戶說「是」,則顯示另一個小對話框,應用程序的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()。在那個時候,管理員仍然活躍,這是有效的。

這是正確的嗎?如何在用戶選擇禁用管理應用程序時擦除設備?

+0

我發現嘗試在onDisableRequested()或onDisable()中執行wipeData()調用會使事物處於不穩定狀態,並且如果屏幕關閉,則數據擦除失敗。你有沒有進一步的運氣呢? – 2012-11-26 19:33:51

+0

如果屏幕關閉,數據擦除能否成功?我們沒有測試這個。 (我們將設備更改爲Android 3.2,我們可以在onDisabled中執行此操作。) – winitzki 2012-11-27 10:52:02

+0

如果我從onDisableRequested()啓動了AsyncTask,我就可以使其運行。我認爲,無論調用onDisableRequested()時執行什麼線程,都無法可靠地在此處執行wipeData()調用。當我從AsyncTask中解僱它時,我發現幾乎立即出現PowerOff對話框。 – 2012-11-27 12:46:07

回答

4

在Android 3.2的,他們有固定的這個問題。在Android 3.1中,問題仍然存在。

現在(Android 3.2)onDisabled仍然有管理員權限,所以你可以擦拭設備。

+0

這聽起來像一個解決方案。你應該接受你自己的答案作爲解決方案。這也會對其他人有幫助,因爲那樣你的問題就會被呈現給其他人,因爲那些問題已經解決了,因此對那些尋求類似問題的解決方案的人來說更有趣。 – 2015-02-05 11:39:41

3

我的建議:不要做,除非它像一個企業式的東西。

不過。在onDisableRequested(),你可以startActivity的主屏幕,然後startActivityActivity您創建,確認他們是否要繼續。如果他們選擇是,那麼你做你的願望(擦除設備),如果他們說沒有,然後就startActivity的主屏幕再次(或finish())。

這樣做仍然存在風險,即他們可以從最近的任務啓動相同的設置頁面,在這種情況下,他們可能會在與自定義文本一起彈出的對話框中按下「是」(或ok)然後繼續禁用設備管理員。爲了避免發生這種情況,您可以做this,希望它能夠啓動初始設置頁面並清除最上面的禁用設備管理屏幕。

而不是擦,你總是可以做resetPassword("new password")然後lockNow()。如果它是一個安全相關的應用程序,那麼該用戶的設備就不必被擦除,並且密碼將由安裝該應用程序的人員預先定義。

讓我知道,如果您有任何其他問題。我希望這有幫助。

編輯:我得到upvote,提醒我這個答案存在,所以我想我會添加一些信息。

您可以將lockNow()與一個活動結合使用,該活動將顯示在鎖定屏幕的頂部,如果您想要鎖定,那麼仍然可以提供擦拭或其他任何內容。
在開始擦拭之前進行鎖定將是一個不錯的主意,以防止由於任何原因導致擦拭物出現錯誤或延遲的問題。

如果在分佈式應用程序(通過應用程序商店)上做這樣的事情,請注意不要違反其政策,因爲違反政策可能導致應用程序商店永久禁止(它發生在我的Google Play上,無非個誤會。)

+0

- 這是一個「類似公司的事情」:)該應用程序是必需的,以擦除設備。 - 我已經嘗試開始一項新活動;但用戶總是可以按「後退」並擺脫它,然後禁用管理員而無需執行任何操作。 - 如果我想重置密碼並鎖定,我需要成爲活動管理員,因此我不能在提供確認對話框後執行此操作。 – winitzki 2012-02-16 09:12:27

+0

- 我將嘗試查看如果強制啓動初始設置頁面會發生什麼情況。 – winitzki 2012-02-16 09:17:46

+0

當我建議使用locknow時,我的意思是在將對話框顯示爲部分解決方案之前,如果您不想沒有確認地擦拭 - 您會鎖定,然後可能是主管或任何擁有密碼的人。如果你可以找到一種方法來清除最近的應用程序(長按主頁),那麼你可以開始家庭活動,你會被設置,但我不認爲有任何合法的方式來清除最近的應用程序。 – Jakar 2012-02-16 10:52:53