Как стереть устройство 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 (), если действие заключается в отключении администратора. Функция verifyWipeDevice () показывает другое действие с диалоговым окном. Это не показывает системное диалоговое окно для подтверждения отключения моего приложения администратора. Однако это не препятствует тому, чтобы приложение было фактически отключено!

Похоже, что система Android делает следующее:

Отправьте ACTION_DEVICE_ADMIN_DISABLE_REQUESTED в AdminReceiver

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

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

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

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

Ответы на вопрос(2)

Ваш ответ на вопрос