Как стереть данные с устройства Android когда администратор устройства деактивирован?

В моем приложении, которое является администратором устройства, мне нужно стереть все устройство, когда пользователь пытается деактивировать функцию администратора приложения. Когда пользователь переходит в Настройки / Безопасность / Администраторы устройства и деактивирует приложение администратора, сначала отображается диалоговое окно «Вы хотите деактивировать».Если пользователь говорит «да», то отображается еще один небольшой диалог с текстом, предоставленным 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 делает следующее:

  • Отправляет ACTION_DEVICE_ADMIN_DISABLE_REQUESTED в AdminReceiver

  • Продолжает отключать администратора независимо от того, что приложение администратора хочет делать

  • Если пользователь отменяет отключение, хорошо; в противном случае приложение отключено. Приложение не может отказаться от отключения или выполнить очистку устройства при отключении.

Единственное решение на данный момент - немедленно стереть данные без подтверждения, когда пользователь хочет отключить приложение администратора. Другими словами, я могу сразу вызвать getManager (). WipeData () в onDisableRequested (). В то время администратор все еще активен, и это работает.

Это правильно? Как стереть данные с устройства, когда пользователь решает отключить приложение администратора?

11
задан winitzki 15 February 2012 в 17:39
поделиться