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