Как стереть Android-устройство, когда администратор устройства отключен?

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

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

В Android 3.2 они исправили эту проблему. В Android 3.1 проблема все еще присутствовала.

Теперь (Android 3.2) в onDisabled вас все еще есть привилегии администратора, и вы можете стереть устройство.

Моя рекомендация: не делайте этого, если это не похоже на дело корпоративного типа.

Но. В onDisableRequested() вы можете startActivity для startActivity экрана, а затем startActivity для созданного вами действия, которое подтверждает, хотят ли они продолжать или нет. Если они выбирают «да», то вы делаете по startActivity устройство), если они говорят «нет», а затем startActivity для домашнего экрана (или finish() ).

Это по-прежнему создает риск того, что они могут запустить одну и ту же страницу настроек из последних задач, при которой они, вероятно, смогут нажать «да» (или ок) в диалоговом окне, которое появилось с вашим пользовательским текстом, а затем продолжить Отключить устройство admin. Чтобы попытаться избежать этого, вы можете сделать это в надежде, что он запустит страницу начальных настроек и очистит самый верхний экран администратора устройства.

Вместо вытирания вы всегда можете выполнить resetPassword("new password") а затем lockNow() . Если это приложение, связанное с безопасностью, то устройство пользователя не нужно стирать, и пароль был предварительно определен человеком, который установил приложение.

Дайте мне знать, если у вас есть еще вопросы. Надеюсь, это поможет.

EDIT: Я получил upvote, который напомнил мне, что этот ответ существует, поэтому я решил, что добавлю некоторую информацию.

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

И если вы делаете что-либо подобное в распределенном приложении (через магазины приложений), старайтесь не нарушать их политику, потому что нарушение правил может привести к постоянному запрету из магазина приложений (это случилось со мной в Google Play, из-за не более чем Недоразумение.)

Intereting Posts
Ошибка раздувания класса RecyclerView Как повлиять на строку в Android Textview BitmapFactory.decodeStream вне памяти, несмотря на использование уменьшенного размера выборки Android: стандартный способ сделать поток запускать каждую секунду Студия Android не распознает запущенный эмулятор Предупреждение андроида прямое Android terminal – telnet отсутствует команды, получая эту ошибку: KO: неизвестная команда, попробуйте 'help' Длительность коротких сеансов в Google Analytics для Android Как применить стиль большого представления к уведомлению с помощью библиотеки Parse Подкасты Android Как реализовать селектор цвета TextView, когда слушатель OnClick установлен в его родительском макете? Каталог для хранения аудиофайлов в Android ArrayIndexOutOfBoundsException в карусели – исключение в обратном вызове MessageQueue и handleReceiveCallback Почему большие блокировки активности Android не работают? Чтение и запись разрешений для хранения и использования галерей для зефира