Платформа Android 2.2 (API 8) предлагает возможности управления устройством системного уровня через API администрирования устройства (Device Administration).
В этом уроке вы узнаете, как создать защищенное приложение, которое управляет доступом к своему содержанию, используя политики управления устройством (device management policies). В частности, приложение может быть настроено таким образом, что будет отображать экран блокировки с достаточно сильным паролем, перед выводом на экран содержания с ограниченным доступом для пользователя.
Определение и объявление политики
Во-первых, необходимо определить виды политики для поддержки на функциональном уровне. Политика может охватывать блокировку экрана паролем, истечение тайм-аута, шифрование и т.д.
Вы должны объявить выбранный набор политик, которая будет обеспечиваться приложением, в файлеres/xml/device_admin.xml
. Android манифест также должен ссылаться на объявленный набор политик.
Каждая объявленная политика соответствует некоторому количеству методов, относящихся к политике устройства вDevicePolicyManager (определение минимальной длины пароля и минимального количества символов верхнего регистра, далее приведены два примера). Если приложение пытается вызвать не объявленные в XML методы соответствующей политики, это приведет к SecurityException во время выполнения. Другие разрешения, такие как force-lock
, доступны, если приложение собирается управлять другими видами политик. Как вы увидите позже, список объявленных политик будет представлен пользователю на экране системы, как часть процесса активации администратором устройства.
Следующий фрагмент объявляет политику длинны пароля в res/xml/device_admin.xml
:
1 2 3 4 5 |
<span class="sc3"><span class="re1"><device-admin</span> <span class="re0">xmlns:android</span>=<span class="st0">"http://schemas.android.com/apk/res/android"</span><span class="re2">></span></span> <span class="sc3"><span class="re1"><uses-policies<span class="re2">></span></span></span> <span class="sc3"><span class="re1"><limit-password</span> <span class="re2">/></span></span> <span class="sc3"><span class="re1"></uses-policies<span class="re2">></span></span></span> <span class="sc3"><span class="re1"></device-admin<span class="re2">></span></span></span> |
XML описание политики в манифесте Android:
1 2 3 4 5 6 7 8 |
<span class="sc3"><span class="re1"><receiver</span> <span class="re0">android:name</span>=<span class="st0">".Policy$PolicyAdmin"</span></span> <span class="sc3"> <span class="re0">android:permission</span>=<span class="st0">"android.permission.BIND_DEVICE_ADMIN"</span><span class="re2">></span></span> <span class="sc3"><span class="re1"><meta-data</span> <span class="re0">android:name</span>=<span class="st0">"android.app.device_admin"</span></span> <span class="sc3"> <span class="re0">android:resource</span>=<span class="st0">"@xml/device_admin"</span> <span class="re2">/></span></span> <span class="sc3"><span class="re1"><intent-filter<span class="re2">></span></span></span> <span class="sc3"><span class="re1"><action</span> <span class="re0">android:name</span>=<span class="st0">"android.app.action.DEVICE_ADMIN_ENABLED"</span> <span class="re2">/></span></span> <span class="sc3"><span class="re1"></intent-filter<span class="re2">></span></span></span> <span class="sc3"><span class="re1"></receiver<span class="re2">></span></span></span> |
Создание Device Administration Receiver
Создадим широковещательный приемник администрирования устройства (Device Administration broadcast receiver), который получает уведомления о событиях, связанных с объявленной политикой. Приложение может выборочно переопределять методы обратного вызова.
В примере приложения, Device Admin, когда администратор устройства отключен пользователем, настройки политики стираются из общих настроек. Вы должны рассмотреть возможность реализации бизнес-логики, которая имеет к вам отношение. Например, приложение может предпринять некоторые действия для смягчения риска безопасности, реализуя некоторую комбинацию удаления важных данных на устройстве, отключения удаленной синхронизации, предупреждение администратора и т.д.
Для работы приемника, не забудьте зарегистрировать его в манифесте Android, как это показано в приведенном выше фрагменте.
1 2 3 4 5 6 7 8 9 10 11 |
<span class="kw2">public</span> <span class="kw2">static</span> <span class="kw2">class</span> PolicyAdmin <span class="kw2">extends</span> DeviceAdminReceiver <span class="br0">{</span> @<span class="kw21">Override</span> <span class="kw2">public</span> <span class="kw3">void</span> onDisabled<span class="br0">(</span><span class="kw166">Context</span> context, Intent intent<span class="br0">)</span> <span class="br0">{</span> <span class="co1">// Called when the app is about to be deactivated as a device administrator.</span> <span class="co1">// Deletes previously stored password policy.</span> <span class="kw2">super</span>.<span class="me1">onDisabled</span><span class="br0">(</span>context, intent<span class="br0">)</span><span class="sy0">;</span> SharedPreferences prefs = context.<span class="me1">getSharedPreferences</span><span class="br0">(</span>APP_PREF, Activity.<span class="me1">MODE_PRIVATE</span><span class="br0">)</span><span class="sy0">;</span> prefs.<span class="me1">edit</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">clear</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">commit</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> |
Активация Device Administration
Перед соблюдением любой из политик, пользователю необходимо вручную активировать приложение в качестве администратора устройства. Фрагмент ниже показывает, как можно вызвать активити настроек, в которой пользователь может активировать приложение. Хорошая практика – это включение пояснительного текста для отображения пользователям, почему приложение обратилось с просьбой сделать его администратором устройства (указывается как дополнение EXTRA_ADD_EXPLANATION в намерении).
Рисунок 1. Экран активации, в котором вы можете предоставить описание вашей политики устройства
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>mPolicy.<span class="me1">isAdminActive</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> Intent activateDeviceAdminIntent = <span class="kw2">new</span> Intent<span class="br0">(</span>DevicePolicyManager.<span class="me1">ACTION_ADD_DEVICE_ADMIN</span><span class="br0">)</span><span class="sy0">;</span> activateDeviceAdminIntent.<span class="me1">putExtra</span><span class="br0">(</span> DevicePolicyManager.<span class="me1">EXTRA_DEVICE_ADMIN</span>, mPolicy.<span class="me1">getPolicyAdmin</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="co1">// It is good practice to include the optional explanation text to</span> <span class="co1">// explain to user why the application is requesting to be a device</span> <span class="co1">// administrator. The system will display this message on the activation</span> <span class="co1">// screen.</span> activateDeviceAdminIntent.<span class="me1">putExtra</span><span class="br0">(</span> DevicePolicyManager.<span class="me1">EXTRA_ADD_EXPLANATION</span>, getResources<span class="br0">(</span><span class="br0">)</span>.<span class="me1">getString</span><span class="br0">(</span>R.<span class="me1">string</span>.<span class="me1">device_admin_activation_message</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> startActivityForResult<span class="br0">(</span>activateDeviceAdminIntent, REQ_ACTIVATE_DEVICE_ADMIN<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> |
Если пользователь выберет “Активировать”, приложение становится администратором устройства и может начать настройку и обеспечение соблюдения политики.
Приложение также должно быть готово к обработке ситуации, когда пользователь покидает процесс активации, нажав кнопку “Отмена”, кнопку “Назад” или кнопку “Главная”. Таким образом, метод onResume() в активити настройки политик должен иметь логику, чтобы пересмотреть условия и представить активацию Администратора Устройства пользователю, если это необходимо.
Реализация контроллера политик устройства
После успешной активации администратора устройства, приложение настраивает диспетчер политик устройста с запрошенной политикой. Имейте в виду, что новые политики добавляются в Android с каждым релизом. Целесообразно выполнять проверку версий в ваших приложениях при использовании новой политики в то время когда поддерживается старая версия платформы. Например, политика минимального количества символов в верхнем регистре в пароле стала доступна только с API 11 (Honeycomb) и выше. Следующий код демонстрирует, как можно проверить версию во время выполнения.
1 2 3 4 5 6 7 8 9 |
DevicePolicyManager mDPM = <span class="br0">(</span>DevicePolicyManager<span class="br0">)</span> context.<span class="me1">getSystemService</span><span class="br0">(</span><span class="kw166">Context</span>.<span class="me1">DEVICE_POLICY_SERVICE</span><span class="br0">)</span><span class="sy0">;</span> ComponentName mPolicyAdmin = <span class="kw2">new</span> ComponentName<span class="br0">(</span>context, PolicyAdmin.<span class="kw2">class</span><span class="br0">)</span><span class="sy0">;</span> ... <span class="me1">mDPM</span>.<span class="me1">setPasswordQuality</span><span class="br0">(</span>mPolicyAdmin, PASSWORD_QUALITY_VALUES<span class="br0">[</span>mPasswordQuality<span class="br0">]</span><span class="br0">)</span><span class="sy0">;</span> mDPM.<span class="me1">setPasswordMinimumLength</span><span class="br0">(</span>mPolicyAdmin, mPasswordLength<span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span>Build.<span class="me1">VERSION</span>.<span class="me1">SDK_INT</span> <span class="sy0">></span>= Build.<span class="me1">VERSION_CODES</span>.<span class="me1">HONEYCOMB</span><span class="br0">)</span> <span class="br0">{</span> mDPM.<span class="me1">setPasswordMinimumUpperCase</span><span class="br0">(</span>mPolicyAdmin, mPasswordMinUpperCase<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> |
В данный момент приложение не может реализовать политику. Пока приложение не имеет доступа к фактическому паролю экрана блокировки, через Device Policy Manager API оно может определить, является ли существующий пароль подходящим для политики. Если окажется, что существующий пароль экрана блокировки не подходит, API администрирования устройства не сможет автоматически принять корректирующие меры. Это ответственность лежит на приложении – нужен явный запуск системы смены пароля экрана блокировки в приложении Settings. Например:
1 2 3 4 5 6 7 |
<span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>mDPM.<span class="me1">isActivePasswordSufficient</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> ... <span class="co1">// Triggers password change screen in Settings.</span> Intent intent = <span class="kw2">new</span> Intent<span class="br0">(</span>DevicePolicyManager.<span class="me1">ACTION_SET_NEW_PASSWORD</span><span class="br0">)</span><span class="sy0">;</span> startActivity<span class="br0">(</span>intent<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> |
Как правило, пользователь может выбрать один из имеющихся механизмов блокировки, например: отсутствие блокировки, шаблон, PIN-код (число) или пароль (буквы и цифры). Когда политики паролей настроены, те типы паролей, которые слабее определенных в политике, будут отключены. Например, если “Числовой” пароль указан в настройках политики, пользователь может выбрать либо PIN-код (числовой) либо пароль (буквы и цифры).
Как только устройство надежно защищено путем создания надлежащего пароля экрана блокировки, приложение позволяет получить доступ к защищаемому содержанию.
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>mDPM.<span class="me1">isAdminActive</span><span class="br0">(</span>..<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="co1">// Activates device administrator.</span> ... <span class="br0">}</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>mDPM.<span class="me1">isActivePasswordSufficient</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="co1">// Launches password set-up screen in Settings.</span> ... <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="co1">// Grants access to secure content.</span> ... <span class="me1">startActivity</span><span class="br0">(</span><span class="kw2">new</span> Intent<span class="br0">(</span>context, SecureActivity.<span class="kw2">class</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">} </span> |
Перевод kraY