Обзор администрирования устройства

Прекращение поддержки администратора устройства . Начиная с Android 9 (уровень API 28), некоторые политики администратора будут помечены как устаревшие при вызове администратором устройства. Мы рекомендуем вам начать готовиться к этим изменениям уже сейчас. Чтобы узнать больше и просмотреть варианты миграции, прочтите статью Прекращение поддержки администратора устройства .

Android включает поддержку корпоративных приложений, предлагая API администрирования устройств Android. API администрирования устройств предоставляет функции администрирования устройств на уровне системы. Эти API позволяют создавать безопасные приложения, полезные в корпоративных условиях, где ИТ-специалистам требуется полный контроль над устройствами сотрудников. Например, встроенное приложение электронной почты Android использует эти API для улучшения поддержки Exchange. С помощью приложения «Электронная почта» администраторы Exchange могут применять политики паролей, включая буквенно-цифровые пароли или числовые ПИН-коды, на всех устройствах. Администраторы также могут удаленно стереть (то есть восстановить заводские настройки) потерянные или украденные телефоны. Пользователи Exchange могут синхронизировать свою электронную почту и данные календаря.

Этот документ предназначен для разработчиков, которые хотят разрабатывать корпоративные решения для устройств под управлением Android. В нем обсуждаются различные функции, предоставляемые API администрирования устройств для обеспечения более надежной безопасности устройств сотрудников на базе Android.

Примечание. Информацию о создании контроллера политики работы для развертываний Android for Work см. в разделе Создание контроллера политики устройства .

Режим владельца безголового устройства

В Android 14 (уровень API 34) представлен режим пользователя безголовой системы (устройства, в которых UserManager.isHeadlessSystemUserMode возвращает true ). В режиме пользователя безголовой системы пользователь системы является фоновым пользователем и полагается на дополнительных пользователей на переднем плане для взаимодействия с конечным пользователем. В Android 14 также представлен аффилированный режим владельца безголового устройства , который добавляет владельца профиля ко всем аффилированным пользователям, кроме системного пользователя, для которого установлен владелец устройства.

В устройствах, настроенных с использованием автономного пользователя системы (когда пользователь системы работает в фоновом режиме), к пользователю или пользователям приоритетного режима применяются только политики устройств, которые являются глобальными по области действия (политики, применимые ко всем пользователям). Подробности см. в addUserRestriction .

Производители устройств Android могут обратиться к руководству , опубликованному на сайте source.android.com.

Обзор API администрирования устройств

Вот примеры типов приложений, которые могут использовать API администрирования устройств:

  • Почтовые клиенты.
  • Приложения безопасности, которые выполняют удаленную очистку.
  • Службы и приложения управления устройствами.

Как это работает?

Вы используете API администрирования устройств для написания приложений администрирования устройств, которые пользователи устанавливают на свои устройства. Приложение администратора устройства применяет нужные политики. Вот как это работает:

  • Системный администратор пишет приложение администратора устройства, которое обеспечивает соблюдение политик безопасности удаленного/локального устройства. Эти политики могут быть жестко запрограммированы в приложении, либо приложение может динамически получать политики со стороннего сервера.
  • Приложение устанавливается на устройства пользователей. В настоящее время в Android нет решения для автоматической подготовки. Вот некоторые способы, которыми системный администратор может распространять приложение среди пользователей:
    • Гугл Плей.
    • Включение установки из другого магазина.
    • Распространение приложения другими способами, например по электронной почте или через веб-сайты.
  • Система предложит пользователю включить приложение администратора устройства. Как и когда это произойдет, зависит от того, как реализовано приложение.
  • Как только пользователи включают приложение администратора устройства, на них распространяются его политики. Соблюдение этих политик обычно дает преимущества, такие как доступ к конфиденциальным системам и данным.

Если пользователи не включают приложение администратора устройства, оно остается на устройстве, но в неактивном состоянии. На пользователей не будут распространяться его политики, и, наоборот, они не получат никаких преимуществ приложения — например, они не смогут синхронизировать данные.

Если пользователь не соблюдает политики (например, если пользователь устанавливает пароль, который нарушает правила), приложение должно решить, как с этим справиться. Однако обычно это приводит к тому, что пользователь не сможет синхронизировать данные.

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

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

Чтобы удалить существующее приложение администратора устройства, пользователям необходимо сначала отменить регистрацию приложения в качестве администратора.

Политика

В корпоративной среде часто бывает так, что устройства сотрудников должны соответствовать строгому набору политик, регулирующих использование устройств. API администрирования устройств поддерживает политики, перечисленные в таблице 1. Обратите внимание, что API администрирования устройств в настоящее время поддерживает только пароли для блокировки экрана:

Таблица 1. Политики, поддерживаемые API администрирования устройств.

Политика Описание
Пароль включен Требуется, чтобы устройства запрашивали PIN-код или пароли.
Минимальная длина пароля Установите необходимое количество символов для пароля. Например, вы можете потребовать, чтобы PIN-код или пароли содержали не менее шести символов.
Требуется буквенно-цифровой пароль Требуется, чтобы пароли содержали комбинацию букв и цифр. Они могут включать символические символы.
Требуется сложный пароль Требуется, чтобы пароли содержали как минимум букву, цифру и специальный символ. Представлено в Android 3.0.
Минимальное количество букв в пароле Минимальное количество букв, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальное количество строчных букв в пароле Минимальное количество строчных букв, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальное количество небуквенных символов, необходимых в пароле Минимальное количество небуквенных символов, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальное число цифр, необходимое в пароле Минимальное количество цифр, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальное количество символов, необходимое в пароле Минимальное количество символов, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальное количество заглавных букв в пароле Минимальное количество заглавных букв, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Таймаут истечения срока действия пароля Когда истечет срок действия пароля, выражается в виде разницы в миллисекундах с момента, когда администратор устройства устанавливает время истечения срока действия. Представлено в Android 3.0.
Ограничение истории паролей Эта политика запрещает пользователям повторно использовать последние n уникальных паролей. Эта политика обычно используется вместе с setPasswordExpirationTimeout() , которая заставляет пользователей обновлять свои пароли по истечении определенного периода времени. Представлено в Android 3.0.
Максимальное количество неудачных попыток ввода пароля Указывает, сколько раз пользователь может ввести неправильный пароль, прежде чем устройство сотрет свои данные. API администрирования устройств также позволяет администраторам удаленно сбрасывать настройки устройства к заводским настройкам. Это защищает данные в случае потери или кражи устройства.
Блокировка максимального времени бездействия Устанавливает продолжительность времени с момента последнего касания пользователем экрана или нажатия кнопки, прежде чем устройство блокирует экран. В этом случае пользователям необходимо снова ввести свой PIN-код или пароли, прежде чем они смогут использовать свои устройства и получить доступ к данным. Значение может находиться в диапазоне от 1 до 60 минут.
Требовать шифрование хранилища Указывает, что область хранения должна быть зашифрована, если устройство поддерживает это. Представлено в Android 3.0.
Отключить камеру Указывает, что камеру следует отключить. Обратите внимание, что это не обязательно должно быть постоянное отключение. Камеру можно включать/отключать динамически в зависимости от контекста, времени и т. д. Представлено в Android 4.0.

Другие особенности

Помимо поддержки политик, перечисленных в таблице выше, API администрирования устройств позволяет делать следующее:

  • Предложить пользователю установить новый пароль.
  • Немедленно заблокируйте устройство.
  • Сотрите данные устройства (то есть восстановите заводские настройки устройства).

Пример приложения

Примеры, использованные на этой странице, основаны на образце API администрирования устройств, который включен в примеры SDK (доступен через Android SDK Manager) и расположен в вашей системе как <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java .

Пример приложения предлагает демонстрацию функций администрирования устройства. Он предоставляет пользователям пользовательский интерфейс, который позволяет им включить приложение администратора устройства. После включения приложения они смогут использовать кнопки пользовательского интерфейса для выполнения следующих действий:

  • Установите качество пароля.
  • Укажите требования к паролю пользователя, такие как минимальная длина, минимальное количество цифровых символов, которые он должен содержать, и т. д.
  • Установите пароль. Если пароль не соответствует указанным политикам, система возвращает ошибку.
  • Установите, сколько неудачных попыток ввода пароля может произойти до того, как устройство будет очищено (т. е. восстановлено до заводских настроек).
  • Установите срок действия пароля.
  • Установите длину истории паролей ( длина относится к количеству старых паролей, хранящихся в истории). Это не позволяет пользователям повторно использовать один из последних n паролей, которые они использовали ранее.
  • Укажите, что область хранения должна быть зашифрована, если устройство это поддерживает.
  • Установите максимальное время неактивности, которое может пройти до блокировки устройства.
  • Немедленно заблокируйте устройство.
  • Стереть данные устройства (то есть восстановить заводские настройки).
  • Отключите камеру.

Рис. 1. Снимок экрана примера приложения.

Разработка приложения для администрирования устройств

Системные администраторы могут использовать API администрирования устройств для написания приложения, которое обеспечивает соблюдение политики безопасности удаленного/локального устройства. В этом разделе кратко описаны шаги, необходимые для создания приложения для администрирования устройств.

Создание манифеста

Чтобы использовать API администрирования устройств, манифест приложения должен включать следующее:

  • Подкласс DeviceAdminReceiver , который включает в себя следующее:
    • Разрешение BIND_DEVICE_ADMIN .
    • Возможность реагировать на намерение ACTION_DEVICE_ADMIN_ENABLED , выраженное в манифесте как фильтр намерения.
  • Декларация политик безопасности, используемых в метаданных.

Вот выдержка из образца манифеста администрирования устройств:

<activity android:name=".app.DeviceAdminSample"
            android:label="@string/activity_sample_device_admin">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.SAMPLE_CODE" />
    </intent-filter>
</activity>
<receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver"
        android:label="@string/sample_device_admin"
        android:description="@string/sample_device_admin_description"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
            android:resource="@xml/device_admin_sample" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

Обратите внимание, что:

  • Следующие атрибуты относятся к строковым ресурсам, которые для примера приложения находятся в ApiDemos/res/values/strings.xml . Дополнительные сведения о ресурсах см. в разделе Ресурсы приложения .
    • android:label="@string/activity_sample_device_admin" относится к читаемой пользователем метке действия.
    • android:label="@string/sample_device_admin" относится к читаемой пользователем метке разрешения.
    • android:description="@string/sample_device_admin_description" относится к читаемому пользователем описанию разрешения. Описание обычно длиннее и информативнее, чем этикетка.
  • android:permission="android.permission.BIND_DEVICE_ADMIN" — это разрешение, которое должен иметь подкласс DeviceAdminReceiver , чтобы гарантировать, что только система может взаимодействовать с получателем (ни одному приложению не может быть предоставлено это разрешение). Это предотвращает злоупотребление другими приложениями приложения администратора вашего устройства.
  • android.app.action.DEVICE_ADMIN_ENABLED — это основное действие, которое должен обрабатывать подкласс DeviceAdminReceiver , чтобы ему было разрешено управлять устройством. Это значение устанавливается на приемнике, когда пользователь включает приложение администратора устройства. Ваш код обычно обрабатывает это в onEnabled() . Для поддержки получателю также должно потребоваться разрешение BIND_DEVICE_ADMIN , чтобы другие приложения не могли злоупотреблять им.
  • Когда пользователь включает приложение администратора устройства, это дает получателю разрешение выполнять действия в ответ на трансляцию определенных системных событий. При возникновении подходящего события приложение может применить политику. Например, если пользователь пытается установить новый пароль, который не соответствует требованиям политики, приложение может предложить пользователю выбрать другой пароль, который соответствует требованиям.
  • Не меняйте имя получателя после публикации приложения. Если имя в манифесте изменится, администратор устройства отключится, когда пользователи обновят приложение. Чтобы узнать больше, см. <receiver> .
  • android:resource="@xml/device_admin_sample" объявляет политики безопасности, используемые в метаданных. Метаданные предоставляют дополнительную информацию, специфичную для администратора устройства, анализируемую классом DeviceAdminInfo . Вот содержимое device_admin_sample.xml :
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-policies>
    <limit-password />
    <watch-login />
    <reset-password />
    <force-lock />
    <wipe-data />
    <expire-password />
    <encrypted-storage />
    <disable-camera />
  </uses-policies>
</device-admin>

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

Дополнительные сведения о файле манифеста см. в Руководстве для разработчиков Android .

Реализация кода

API администрирования устройств включает следующие классы:

DeviceAdminReceiver
Базовый класс для реализации компонента администрирования устройства. Этот класс обеспечивает удобство интерпретации необработанных действий намерения, отправляемых системой. Ваше приложение администрирования устройств должно включать подкласс DeviceAdminReceiver .
DevicePolicyManager
Класс для управления политиками, применяемыми на устройстве. Большинство клиентов этого класса должны опубликовать DeviceAdminReceiver , который в данный момент включен пользователем. DevicePolicyManager управляет политиками для одного или нескольких экземпляров DeviceAdminReceiver .
DeviceAdminInfo
Этот класс используется для указания метаданных для компонента администратора устройства.

Эти классы обеспечивают основу для полнофункционального приложения для администрирования устройств. В оставшейся части этого раздела описывается, как использовать API-интерфейсы DeviceAdminReceiver и DevicePolicyManager для написания приложения администратора устройства.

Создание подкласса DeviceAdminReceiver

Чтобы создать приложение администратора устройства, необходимо создать подкласс DeviceAdminReceiver . Класс DeviceAdminReceiver состоит из серии обратных вызовов, которые запускаются при возникновении определенных событий.

В подклассе DeviceAdminReceiver пример приложения просто отображает Toast уведомление в ответ на определенные события. Например:

Котлин

class DeviceAdminSample : DeviceAdminReceiver() {

    private fun showToast(context: Context, msg: String) {
        context.getString(R.string.admin_receiver_status, msg).let { status ->
            Toast.makeText(context, status, Toast.LENGTH_SHORT).show()
        }
    }

    override fun onEnabled(context: Context, intent: Intent) =
            showToast(context, context.getString(R.string.admin_receiver_status_enabled))

    override fun onDisableRequested(context: Context, intent: Intent): CharSequence =
            context.getString(R.string.admin_receiver_status_disable_warning)

    override fun onDisabled(context: Context, intent: Intent) =
            showToast(context, context.getString(R.string.admin_receiver_status_disabled))

    override fun onPasswordChanged(context: Context, intent: Intent, userHandle: UserHandle) =
            showToast(context, context.getString(R.string.admin_receiver_status_pw_changed))
...
}

Ява

public class DeviceAdminSample extends DeviceAdminReceiver {

    void showToast(Context context, String msg) {
        String status = context.getString(R.string.admin_receiver_status, msg);
        Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onEnabled(Context context, Intent intent) {
        showToast(context, context.getString(R.string.admin_receiver_status_enabled));
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return context.getString(R.string.admin_receiver_status_disable_warning);
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        showToast(context, context.getString(R.string.admin_receiver_status_disabled));
    }

    @Override
    public void onPasswordChanged(Context context, Intent intent, UserHandle userHandle) {
        showToast(context, context.getString(R.string.admin_receiver_status_pw_changed));
    }
...
}

Включение приложения

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

Процесс включения приложения начинается, когда пользователь выполняет действие, которое запускает намерение ACTION_ADD_DEVICE_ADMIN . В примере приложения это происходит, когда пользователь устанавливает флажок Включить администратора .

Когда пользователь устанавливает флажок «Включить администрирование» , дисплей меняется, предлагая пользователю активировать приложение администратора устройства, как показано на рисунке 2.

Рисунок 2. Пример приложения: активация приложения

Ниже приведен код, который выполняется, когда пользователь устанавливает флажок «Включить администратора» . Это приводит к запуску обратного вызова onPreferenceChange() . Этот обратный вызов вызывается, когда значение этого Preference было изменено пользователем и скоро будет установлено и/или сохранено. Если пользователь включает приложение, дисплей меняется, предлагая пользователю активировать приложение администратора устройства, как показано на рисунке 2. В противном случае приложение администратора устройства отключается.

Котлин

override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
    if (super.onPreferenceChange(preference, newValue)) return true
    val value = newValue as Boolean
    if (preference == enableCheckbox) {
        if (value != adminActive) {
            if (value) {
                // Launch the activity to have the user enable our admin.
                val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).apply {
                    putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample)
                    putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                            activity.getString(R.string.add_admin_extra_app_text))
                }
                startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN)
                // return false - don't update checkbox until we're really active
                return false
            } else {
                dpm.removeActiveAdmin(deviceAdminSample)
                enableDeviceCapabilitiesArea(false)
                adminActive = false
            }
        }
    } else if (preference == disableCameraCheckbox) {
        dpm.setCameraDisabled(deviceAdminSample, value)
    }
    return true
}

Ява

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
    if (super.onPreferenceChange(preference, newValue)) {
        return true;
    }
    boolean value = (Boolean) newValue;
    if (preference == enableCheckbox) {
        if (value != adminActive) {
            if (value) {
                // Launch the activity to have the user enable our admin.
                Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample);
                intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                        activity.getString(R.string.add_admin_extra_app_text));
                startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);
                // return false - don't update checkbox until we're really active
                return false;
            } else {
                dpm.removeActiveAdmin(deviceAdminSample);
                enableDeviceCapabilitiesArea(false);
                adminActive = false;
            }
        }
    } else if (preference == disableCameraCheckbox) {
        dpm.setCameraDisabled(deviceAdminSample, value);
    }
    return true;
}

В строке intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample) указано, что mDeviceAdminSample (который является компонентом DeviceAdminReceiver ) является целевой политикой. Эта строка вызывает пользовательский интерфейс, показанный на рисунке 2, который помогает пользователям добавить администратора устройства в систему (или позволяет им отклонить его).

Когда приложению необходимо выполнить операцию, которая зависит от включения приложения администратора устройства, оно подтверждает, что приложение активно. Для этого он использует метод DevicePolicyManager isAdminActive() . Обратите внимание, что метод DevicePolicyManager isAdminActive() принимает в качестве аргумента компонент DeviceAdminReceiver :

Котлин

private lateinit var dpm: DevicePolicyManager
...
private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)

Ява

DevicePolicyManager dpm;
...
private boolean isActiveAdmin() {
    return dpm.isAdminActive(deviceAdminSample);
}

Управление политиками

DevicePolicyManager — это общедоступный класс для управления политиками, применяемыми на устройстве. DevicePolicyManager управляет политиками для одного или нескольких экземпляров DeviceAdminReceiver .

Вы получаете дескриптор DevicePolicyManager следующим образом:

Котлин

dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

Ява

DevicePolicyManager dpm =
    (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);

В этом разделе описывается, как использовать DevicePolicyManager для выполнения административных задач:

Установите политику паролей

DevicePolicyManager включает API для настройки и обеспечения соблюдения политики паролей устройств. В API администрирования устройств пароль применяется только к блокировке экрана. В этом разделе описаны общие задачи, связанные с паролями.

Установите пароль для устройства

Этот код отображает пользовательский интерфейс, предлагающий пользователю установить пароль:

Котлин

Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent ->
    startActivity(intent)
}

Ява

Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
startActivity(intent);
Установите качество пароля

Качество пароля может быть одной из следующих констант DevicePolicyManager :

PASSWORD_QUALITY_ALPHABETIC
Пользователь должен ввести пароль, содержащий как минимум буквы (или другие символы).
PASSWORD_QUALITY_ALPHANUMERIC
Пользователь должен ввести пароль, содержащий как минимум цифровые и буквенные (или другие символы) символы.
PASSWORD_QUALITY_NUMERIC
Пользователь должен ввести пароль, содержащий как минимум числовые символы.
PASSWORD_QUALITY_COMPLEX
Пользователь должен ввести пароль, содержащий как минимум букву, цифру и специальный символ.
PASSWORD_QUALITY_SOMETHING
Политика требует какой-то пароль, но не важно, какой он.
PASSWORD_QUALITY_UNSPECIFIED
Политика не имеет требований к паролю.

Например, вот как можно настроить политику паролей, требующую буквенно-цифровой пароль:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
Установите требования к содержанию пароля

Начиная с Android 3.0, класс DevicePolicyManager включает методы, позволяющие точно настроить содержимое пароля. Например, вы можете установить политику, согласно которой пароли должны содержать как минимум n заглавных букв. Вот методы точной настройки содержимого пароля:

Например, в этом фрагменте указано, что пароль должен состоять как минимум из двух заглавных букв:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwMinUppercase = 2
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwMinUppercase = 2;
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
Установите минимальную длину пароля

Вы можете указать, что длина пароля должна быть не меньше указанной минимальной длины. Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwLength: Int = ...
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwLength;
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
Установите максимальное количество неудачных попыток ввода пароля

Вы можете установить максимальное количество разрешенных неудачных попыток ввода пароля, прежде чем устройство будет очищено (то есть сбросится к заводским настройкам). Например:

Котлин

val dPM:DevicePolicyManager
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val maxFailedPw: Int = ...
...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int maxFailedPw;
 ...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
Установить таймаут истечения срока действия пароля

Начиная с Android 3.0, вы можете использовать метод setPasswordExpirationTimeout() чтобы установить срок действия пароля, выраженный в виде разницы в миллисекундах с момента, когда администратор устройства устанавливает время истечения срока действия. Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwExpiration: Long = ...
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
long pwExpiration;
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
Ограничить пароль на основе истории

Начиная с Android 3.0, вы можете использовать метод setPasswordHistoryLength() чтобы ограничить возможность пользователей повторно использовать старые пароли. Этот метод принимает параметр длины , который указывает, сколько старых паролей хранится. Когда эта политика активна, пользователи не могут вводить новый пароль, соответствующий n последних паролей. Это не позволяет пользователям использовать один и тот же пароль снова и снова. Эта политика обычно используется вместе с setPasswordExpirationTimeout() , которая заставляет пользователей обновлять свои пароли по истечении определенного периода времени.

Например, этот фрагмент запрещает пользователям повторно использовать любой из последних 5 паролей:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwHistoryLength = 5
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwHistoryLength = 5;
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength);

Установить блокировку устройства

Вы можете установить максимальный период бездействия пользователя, который может произойти до блокировки устройства. Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val timeMs: Long = 1000L * timeout.text.toString().toLong()
...
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
long timeMs = 1000L*Long.parseLong(timeout.getText().toString());
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs);

Вы также можете программно указать устройству на немедленную блокировку:

Котлин

private lateinit var dpm: DevicePolicyManager
dpm.lockNow()

Ява

DevicePolicyManager dpm;
dpm.lockNow();

Выполнить очистку данных

Вы можете использовать метод wipeData() DevicePolicyManager для сброса устройства к заводским настройкам. Это полезно, если устройство потеряно или украдено. Часто решение об очистке устройства является результатом выполнения определенных условий. Например, вы можете использовать setMaximumFailedPasswordsForWipe() чтобы указать, что данные с устройства должны быть очищены после определенного количества неудачных попыток ввода пароля.

Вы стираете данные следующим образом:

Котлин

private lateinit var dpm: DevicePolicyManager
dpm.wipeData(0)

Ява

DevicePolicyManager dpm;
dpm.wipeData(0);

Метод wipeData() принимает в качестве параметра битовую маску дополнительных опций. В настоящее время значение должно быть 0.

Отключить камеру

Начиная с Android 4.0, вы можете отключить камеру. Обратите внимание, что это не обязательно должно быть постоянное отключение. Камеру можно включать/отключать динамически в зависимости от контекста, времени и т. д.

Вы контролируете, отключена ли камера, с помощью метода setCameraDisabled() . Например, этот фрагмент позволяет включить или отключить камеру в зависимости от установки флажка:

Котлин

private lateinit var disableCameraCheckbox: CheckBoxPreference
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)

Ява

private CheckBoxPreference disableCameraCheckbox;
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());

Шифрование хранилища

Начиная с Android 3.0, вы можете использовать метод setStorageEncryption() , чтобы установить политику, требующую шифрования области хранения, если это поддерживается.

Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setStorageEncryption(deviceAdminSample, true)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setStorageEncryption(deviceAdminSample, true);

Полный пример включения шифрования хранилища см. в примере API администрирования устройств.

Дополнительные примеры кода

Примеры Android AppRestrictionEnforcer и DeviceOwner дополнительно демонстрируют использование API, описанных на этой странице.

,

Прекращение поддержки администратора устройства . Начиная с Android 9 (уровень API 28), некоторые политики администратора будут помечены как устаревшие при вызове администратором устройства. Мы рекомендуем вам начать готовиться к этим изменениям уже сейчас. Чтобы узнать больше и просмотреть варианты миграции, прочтите статью Прекращение поддержки администратора устройства .

Android включает поддержку корпоративных приложений, предлагая API администрирования устройств Android. API администрирования устройств предоставляет функции администрирования устройств на уровне системы. Эти API позволяют создавать безопасные приложения, полезные в корпоративных условиях, где ИТ-специалистам требуется полный контроль над устройствами сотрудников. Например, встроенное приложение электронной почты Android использует эти API для улучшения поддержки Exchange. С помощью приложения «Электронная почта» администраторы Exchange могут применять политику паролей, включая буквенно-цифровые пароли или числовые ПИН-коды, на всех устройствах. Администраторы также могут удаленно стереть (то есть восстановить заводские настройки) потерянные или украденные телефоны. Пользователи Exchange могут синхронизировать свою электронную почту и данные календаря.

Этот документ предназначен для разработчиков, которые хотят разрабатывать корпоративные решения для устройств под управлением Android. В нем обсуждаются различные функции, предоставляемые API администрирования устройств для обеспечения более надежной безопасности устройств сотрудников на базе Android.

Примечание. Информацию о создании контроллера рабочей политики для развертываний Android for Work см. в разделе Создание контроллера политики устройства .

Режим владельца безголового устройства

В Android 14 (уровень API 34) представлен режим пользователя безголовой системы (устройства, в которых UserManager.isHeadlessSystemUserMode возвращает true ). В режиме пользователя безголовой системы пользователь системы является фоновым пользователем и полагается на дополнительных пользователей на переднем плане для взаимодействия с конечным пользователем. В Android 14 также представлен аффилированный режим владельца безголового устройства , который добавляет владельца профиля ко всем аффилированным пользователям, кроме системного пользователя, для которого установлен владелец устройства.

В устройствах, настроенных с использованием автономного пользователя системы (где пользователь системы работает в фоновом режиме), к пользователю или пользователям приоритетного режима применяются только политики устройства, которые являются глобальными по области действия (политики, применимые ко всем пользователям). Подробности см. в addUserRestriction .

Производители устройств Android могут обратиться к руководству , опубликованному на сайте source.android.com.

Обзор API администрирования устройств

Вот примеры типов приложений, которые могут использовать API администрирования устройств:

  • Почтовые клиенты.
  • Приложения безопасности, которые выполняют удаленную очистку.
  • Службы и приложения управления устройствами.

Как это работает?

Вы используете API администрирования устройств для написания приложений администрирования устройств, которые пользователи устанавливают на свои устройства. Приложение администратора устройства применяет нужные политики. Вот как это работает:

  • Системный администратор пишет приложение администратора устройства, которое обеспечивает соблюдение политик безопасности удаленного/локального устройства. Эти политики могут быть жестко запрограммированы в приложении, либо приложение может динамически получать политики со стороннего сервера.
  • Приложение устанавливается на устройства пользователей. В настоящее время в Android нет решения для автоматической подготовки. Вот некоторые способы, которыми системный администратор может распространять приложение среди пользователей:
    • Гугл Плей.
    • Включение установки из другого магазина.
    • Распространение приложения другими способами, например по электронной почте или через веб-сайты.
  • Система предложит пользователю включить приложение администратора устройства. Как и когда это произойдет, зависит от того, как реализовано приложение.
  • Как только пользователи включают приложение администратора устройства, на них распространяются его политики. Соблюдение этих политик обычно дает преимущества, такие как доступ к конфиденциальным системам и данным.

Если пользователи не включают приложение администратора устройства, оно остается на устройстве, но в неактивном состоянии. На пользователей не будут распространяться его политики, и, наоборот, они не получат никаких преимуществ приложения — например, они не смогут синхронизировать данные.

Если пользователь не соблюдает политики (например, если пользователь устанавливает пароль, который нарушает правила), приложение должно решить, как с этим справиться. Однако обычно это приводит к тому, что пользователь не сможет синхронизировать данные.

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

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

Чтобы удалить существующее приложение администратора устройства, пользователям необходимо сначала отменить регистрацию приложения в качестве администратора.

Политика

В корпоративной среде часто бывает так, что устройства сотрудников должны соответствовать строгому набору политик, регулирующих использование устройств. API администрирования устройств поддерживает политики, перечисленные в Таблице 1. Обратите внимание, что API администрирования устройств в настоящее время поддерживает только пароли для блокировки экрана:

Таблица 1. Политики, поддерживаемые API администрирования устройств.

Политика Описание
Пароль включен Требуется, чтобы устройства запрашивали PIN-код или пароли.
Минимальная длина пароля Установите необходимое количество символов для пароля. Например, вы можете потребовать, чтобы PIN-код или пароли содержали не менее шести символов.
Требуется буквенно-цифровой пароль Требуется, чтобы пароли содержали комбинацию букв и цифр. Они могут включать символические символы.
Требуется сложный пароль Требуется, чтобы пароли содержали как минимум букву, цифру и специальный символ. Представлено в Android 3.0.
Минимальное количество букв в пароле Минимальное количество букв, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальное количество строчных букв в пароле Минимальное количество строчных букв, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальное количество небуквенных символов, необходимых в пароле Минимальное количество небуквенных символов, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальное число цифр, необходимое в пароле Минимальное количество цифр, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальное количество символов, необходимое в пароле Минимальное количество символов, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальное количество заглавных букв в пароле Минимальное количество заглавных букв, необходимое в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Таймаут истечения срока действия пароля Когда истечет срок действия пароля, выражается в виде разницы в миллисекундах с момента, когда администратор устройства устанавливает время истечения срока действия. Представлено в Android 3.0.
Ограничение истории паролей Эта политика запрещает пользователям повторно использовать последние n уникальных паролей. Эта политика обычно используется вместе с setPasswordExpirationTimeout() , которая заставляет пользователей обновлять свои пароли по истечении определенного периода времени. Представлено в Android 3.0.
Максимальное количество неудачных попыток ввода пароля Указывает, сколько раз пользователь может ввести неправильный пароль, прежде чем устройство сотрет свои данные. API администрирования устройств также позволяет администраторам удаленно сбрасывать настройки устройства к заводским настройкам. Это защищает данные в случае потери или кражи устройства.
Блокировка максимального времени бездействия Устанавливает продолжительность времени с момента последнего касания пользователем экрана или нажатия кнопки, прежде чем устройство блокирует экран. В этом случае пользователям необходимо снова ввести свой PIN-код или пароли, прежде чем они смогут использовать свои устройства и получить доступ к данным. Значение может находиться в диапазоне от 1 до 60 минут.
Требовать шифрование хранилища Указывает, что область хранения должна быть зашифрована, если устройство поддерживает это. Представлено в Android 3.0.
Отключить камеру Указывает, что камеру следует отключить. Обратите внимание, что это не обязательно должно быть постоянное отключение. Камеру можно включать/отключать динамически в зависимости от контекста, времени и т. д. Представлено в Android 4.0.

Другие особенности

Помимо поддержки политик, перечисленных в таблице выше, API администрирования устройств позволяет делать следующее:

  • Предложить пользователю установить новый пароль.
  • Немедленно заблокируйте устройство.
  • Сотрите данные устройства (то есть восстановите заводские настройки устройства).

Пример приложения

Примеры, используемые на этой странице, основаны на образце API администрирования устройств, который включен в примеры SDK (доступен через Android SDK Manager) и расположен в вашей системе как <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java .

Пример приложения предлагает демонстрацию функций администрирования устройства. Он предоставляет пользователям пользовательский интерфейс, который позволяет им включить приложение администратора устройства. После включения приложения они смогут использовать кнопки пользовательского интерфейса для выполнения следующих действий:

  • Установите качество пароля.
  • Укажите требования к паролю пользователя, такие как минимальная длина, минимальное количество цифровых символов, которые он должен содержать, и т. д.
  • Установите пароль. Если пароль не соответствует указанным политикам, система возвращает ошибку.
  • Установите, сколько может произойти неудачных попыток ввода пароля, прежде чем устройство будет очищено (т. е. восстановлено до заводских настроек).
  • Установите срок действия пароля.
  • Установите длину истории паролей ( длина относится к количеству старых паролей, хранящихся в истории). Это не позволяет пользователям повторно использовать один из последних n паролей, которые они использовали ранее.
  • Укажите, что область хранения должна быть зашифрована, если устройство это поддерживает.
  • Установите максимальное время неактивности, которое может пройти до блокировки устройства.
  • Немедленно заблокируйте устройство.
  • Стереть данные устройства (то есть восстановить заводские настройки).
  • Отключите камеру.

Рис. 1. Снимок экрана примера приложения.

Разработка приложения для администрирования устройств

Системные администраторы могут использовать API администрирования устройств для написания приложения, которое обеспечивает соблюдение политики безопасности удаленного/локального устройства. В этом разделе кратко описаны шаги, необходимые для создания приложения для администрирования устройства.

Создание манифеста

Чтобы использовать API администрирования устройств, манифест приложения должен включать следующее:

  • Подкласс DeviceAdminReceiver , который включает в себя следующее:
    • Разрешение BIND_DEVICE_ADMIN .
    • Возможность реагировать на намерение ACTION_DEVICE_ADMIN_ENABLED , выраженное в манифесте как фильтр намерения.
  • Декларация политик безопасности, используемых в метаданных.

Вот выдержка из образца манифеста администрирования устройств:

<activity android:name=".app.DeviceAdminSample"
            android:label="@string/activity_sample_device_admin">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.SAMPLE_CODE" />
    </intent-filter>
</activity>
<receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver"
        android:label="@string/sample_device_admin"
        android:description="@string/sample_device_admin_description"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
            android:resource="@xml/device_admin_sample" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

Обратите внимание, что:

  • Следующие атрибуты относятся к строковым ресурсам, которые для образца приложения находятся в ApiDemos/res/values/strings.xml . Для получения дополнительной информации о ресурсах см. Ресурсы приложений .
    • android:label="@string/activity_sample_device_admin" относится к читаемой пользователю метке для деятельности.
    • android:label="@string/sample_device_admin" относится к читаемой пользователю метке для разрешения.
    • android:description="@string/sample_device_admin_description" относится к читаемому пользователю описанию разрешения. Descripton, как правило, длиннее и более информативно, чем этикетка.
  • android:permission="android.permission.BIND_DEVICE_ADMIN" - это разрешение, которое должен иметь подкласс DeviceAdminReceiver , чтобы гарантировать, что только система может взаимодействовать с приемником (приложение не может быть предоставлено этому разрешению). Это мешает другим приложениям злоупотреблять приложением администратора вашего устройства.
  • android.app.action.DEVICE_ADMIN_ENABLED - это основное действие, которое подкласс DeviceAdminReceiver должен обрабатывать, чтобы управлять устройством. Это установлено на приемник, когда пользователь включает приложение администратора устройства. Ваш код обычно обрабатывает это в onEnabled() . Для поддержки, приемник также должен требовать разрешения BIND_DEVICE_ADMIN , чтобы другие приложения не могли злоупотреблять им.
  • Когда пользователь разрешает приложение Admin Device, это дает разрешение приемника выполнять действия в ответ на трансляцию конкретных системных событий. Когда возникает подходящее событие, приложение может навязать политику. Например, если пользователь пытается установить новый пароль, который не соответствует требованиям политики, приложение может побудить пользователя выбрать другой пароль, который соответствует требованиям.
  • Избегайте изменения имени приемника после публикации вашего приложения. Если имя в манифесте изменяется, администратор устройства отключается, когда пользователи обновляют приложение. Чтобы узнать больше, см. <receiver> .
  • android:resource="@xml/device_admin_sample" объявляет политики безопасности, используемые в метаданных. Метаданные предоставляют дополнительную информацию, специально предназначенную для администратора устройства, как проанализировано классом DeviceAdminInfo . Вот содержимое device_admin_sample.xml :
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-policies>
    <limit-password />
    <watch-login />
    <reset-password />
    <force-lock />
    <wipe-data />
    <expire-password />
    <encrypted-storage />
    <disable-camera />
  </uses-policies>
</device-admin>

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

Более подробное обсуждение манифестного файла см. Руководство по разработчикам Android .

Реализация кода

API администрирования устройства включает в себя следующие классы:

DeviceAdminReceiver
Базовый класс для реализации компонента администрирования устройства. Этот класс обеспечивает удобство для интерпретации действий необработанных намерений, которые отправляются системой. Ваше приложение для администрирования устройства должно включать подкласс DeviceAdminReceiver .
DevicePolicyManager
Класс для управления политиками применяется на устройстве. Большинство клиентов этого класса, должно быть, опубликовали DeviceAdminReceiver , который пользователь включен в настоящее время. DevicePolicyManager управляет политиками для одного или нескольких экземпляров DeviceAdminReceiver
DeviceAdminInfo
Этот класс используется для указания метаданных для компонента администратора устройства.

Эти классы предоставляют основу для полностью функционального приложения администрирования устройства. В остальной части этого раздела описывается, как вы используете API DeviceAdminReceiver и DevicePolicyManager для написания приложения администратора устройства.

Подкласс DeviceadminReceiver

Чтобы создать приложение администратора устройства, вы должны подкласс DeviceAdminReceiver . Класс DeviceAdminReceiver состоит из серии обратных вызовов, которые запускаются, когда происходят конкретные события.

В своем подкласс DeviceAdminReceiver образец приложение просто отображает уведомление Toast в ответ на конкретные события. Например:

Котлин

class DeviceAdminSample : DeviceAdminReceiver() {

    private fun showToast(context: Context, msg: String) {
        context.getString(R.string.admin_receiver_status, msg).let { status ->
            Toast.makeText(context, status, Toast.LENGTH_SHORT).show()
        }
    }

    override fun onEnabled(context: Context, intent: Intent) =
            showToast(context, context.getString(R.string.admin_receiver_status_enabled))

    override fun onDisableRequested(context: Context, intent: Intent): CharSequence =
            context.getString(R.string.admin_receiver_status_disable_warning)

    override fun onDisabled(context: Context, intent: Intent) =
            showToast(context, context.getString(R.string.admin_receiver_status_disabled))

    override fun onPasswordChanged(context: Context, intent: Intent, userHandle: UserHandle) =
            showToast(context, context.getString(R.string.admin_receiver_status_pw_changed))
...
}

Ява

public class DeviceAdminSample extends DeviceAdminReceiver {

    void showToast(Context context, String msg) {
        String status = context.getString(R.string.admin_receiver_status, msg);
        Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onEnabled(Context context, Intent intent) {
        showToast(context, context.getString(R.string.admin_receiver_status_enabled));
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return context.getString(R.string.admin_receiver_status_disable_warning);
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        showToast(context, context.getString(R.string.admin_receiver_status_disabled));
    }

    @Override
    public void onPasswordChanged(Context context, Intent intent, UserHandle userHandle) {
        showToast(context, context.getString(R.string.admin_receiver_status_pw_changed));
    }
...
}

Включение приложения

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

Процесс включения приложения начинается, когда пользователь выполняет действие, которое запускает намерение ACTION_ADD_DEVICE_ADMIN . В примере примера это происходит, когда пользователь нажимает на флажок «Включить администратор» .

Когда пользователь нажимает флажок «Включить администратор» , дисплей меняется, чтобы попросить пользователя активировать приложение администратора устройства, как показано на рисунке 2.

Рисунок 2. Пример приложения: активация приложения

Ниже приведен код, который выполняется, когда пользователь нажимает на флажок «Включить администратор» . Это влияет на обратный вызов onPreferenceChange() . Этот обратный вызов вызывается, когда значение этого Preference было изменено пользователем и собирается быть установлено и/или сохраняется. Если пользователь включает в себя приложение, дисплей изменяется, чтобы попросить пользователя активировать приложение администратора устройства, как показано на рисунке 2. В противном случае приложение администратора устройства отключено.

Котлин

override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
    if (super.onPreferenceChange(preference, newValue)) return true
    val value = newValue as Boolean
    if (preference == enableCheckbox) {
        if (value != adminActive) {
            if (value) {
                // Launch the activity to have the user enable our admin.
                val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).apply {
                    putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample)
                    putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                            activity.getString(R.string.add_admin_extra_app_text))
                }
                startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN)
                // return false - don't update checkbox until we're really active
                return false
            } else {
                dpm.removeActiveAdmin(deviceAdminSample)
                enableDeviceCapabilitiesArea(false)
                adminActive = false
            }
        }
    } else if (preference == disableCameraCheckbox) {
        dpm.setCameraDisabled(deviceAdminSample, value)
    }
    return true
}

Ява

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
    if (super.onPreferenceChange(preference, newValue)) {
        return true;
    }
    boolean value = (Boolean) newValue;
    if (preference == enableCheckbox) {
        if (value != adminActive) {
            if (value) {
                // Launch the activity to have the user enable our admin.
                Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample);
                intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                        activity.getString(R.string.add_admin_extra_app_text));
                startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);
                // return false - don't update checkbox until we're really active
                return false;
            } else {
                dpm.removeActiveAdmin(deviceAdminSample);
                enableDeviceCapabilitiesArea(false);
                adminActive = false;
            }
        }
    } else if (preference == disableCameraCheckbox) {
        dpm.setCameraDisabled(deviceAdminSample, value);
    }
    return true;
}

Line intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample) утверждает, что mDeviceAdminSample (который является компонентом DeviceAdminReceiver ) является целевой политикой. Эта строка вызывает пользовательский интерфейс, показанный на рисунке 2, который направляет пользователей путем добавления администратора устройства в систему (или позволяет им отклонить его).

Когда приложение необходимо выполнить операцию, которая зависит от включения приложения администратора устройства, оно подтверждает, что приложение активно. Для этого он использует метод DevicePolicyManager isAdminActive() . Обратите внимание, что метод DevicePolicyManager isAdminActive() принимает компонент DeviceAdminReceiver в качестве аргумента:

Котлин

private lateinit var dpm: DevicePolicyManager
...
private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)

Ява

DevicePolicyManager dpm;
...
private boolean isActiveAdmin() {
    return dpm.isAdminActive(deviceAdminSample);
}

Управление политикой

DevicePolicyManager - это открытый класс для управления политиками, применяемыми на устройстве. DevicePolicyManager управляет политиками для одного или нескольких экземпляров DeviceAdminReceiver .

Вы получаете ручку для DevicePolicyManager следующим образом:

Котлин

dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

Ява

DevicePolicyManager dpm =
    (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);

В этом разделе описывается, как использовать DevicePolicyManager для выполнения административных задач:

Установите политики пароля

DevicePolicyManager включает API для настройки и обеспечения соблюдения политики пароля устройства. В API администрирования устройства пароль применяется только к блокировке экрана. В этом разделе описывается общие задачи, связанные с паролем.

Установите пароль для устройства

Этот код отображает пользовательский интерфейс, предлагающий пользователю установить пароль:

Котлин

Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent ->
    startActivity(intent)
}

Ява

Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
startActivity(intent);
Установите качество пароля

Качество пароля может быть одной из следующих констант DevicePolicyManager :

PASSWORD_QUALITY_ALPHABETIC
Пользователь должен ввести пароль, содержащий по крайней мере алфавитные (или другие символы) символы.
PASSWORD_QUALITY_ALPHANUMERIC
Пользователь должен ввести пароль, содержащий как минимум как числовые , так и алфавитные (или другие символы) символы.
PASSWORD_QUALITY_NUMERIC
Пользователь должен ввести пароль, содержащий как минимум числовые символы.
PASSWORD_QUALITY_COMPLEX
Пользователь должен ввести пароль, содержащий хотя бы букву, численную цифру и специальный символ.
PASSWORD_QUALITY_SOMETHING
Политика требует какого -то пароля, но не заботится о том, что это такое.
PASSWORD_QUALITY_UNSPECIFIED
Политика не имеет требований к паролю.

Например, именно так вы установили бы полис пароля, чтобы потребовать буквенно -цифровой пароль:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
Установить требования к контенту пароля

Начиная с Android 3.0, класс DevicePolicyManager включает в себя методы, которые позволяют точно настроить содержимое пароля. Например, вы можете установить политику, в которой говорится, что пароли должны содержать как минимум n заглавных букв. Вот методы для точной настройки содержимого пароля:

Например, этот фрагмент гласит, что пароль должен иметь не менее 2 прописных букв:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwMinUppercase = 2
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwMinUppercase = 2;
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
Установите минимальную длину пароля

Вы можете указать, что пароль должен быть не менее указанной минимальной длины. Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwLength: Int = ...
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwLength;
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
Установить максимальные неудачные попытки пароля

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

Котлин

val dPM:DevicePolicyManager
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val maxFailedPw: Int = ...
...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int maxFailedPw;
 ...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
Установите время ожидания истечения срока действия пароля

Начиная с Android 3.0, вы можете использовать метод setPasswordExpirationTimeout() для установки, когда срок действия пароля будет срок действия, выраженный как дельта в миллисекундах, когда администратор устройства устанавливает время ожидания истечения срока действия. Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwExpiration: Long = ...
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
long pwExpiration;
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
Ограничить пароль на основе истории

Начиная с Android 3.0, вы можете использовать метод setPasswordHistoryLength() чтобы ограничить способность пользователей повторно использовать старые пароли. Этот метод принимает параметр длины , который указывает, сколько старых паролей сохраняется. Когда эта политика активна, пользователи не могут ввести новый пароль, который соответствует последним N -паролям. Это мешает пользователям использовать тот же пароль снова и снова. Эта политика обычно используется в сочетании с setPasswordExpirationTimeout() , которая заставляет пользователей обновлять свои пароли после того, как истекло указанное количество времени.

Например, этот фрагмент запрещает пользователям повторное использование любого из своих последних 5 паролей:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwHistoryLength = 5
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwHistoryLength = 5;
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength);

Установить блокировку устройства

Вы можете установить максимальный период бездействия пользователей, который может произойти до блокировки устройства. Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val timeMs: Long = 1000L * timeout.text.toString().toLong()
...
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
long timeMs = 1000L*Long.parseLong(timeout.getText().toString());
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs);

Вы также можете программно сообщить устройству немедленно блокировать:

Котлин

private lateinit var dpm: DevicePolicyManager
dpm.lockNow()

Ява

DevicePolicyManager dpm;
dpm.lockNow();

Выполните Wipe Data

Вы можете использовать метод DevicePolicyManager wipeData() для сброса устройства в настройки заводов. Это полезно, если устройство потеряно или украдено. Часто решение вытирать устройство является результатом выполнения определенных условий. Например, вы можете использовать setMaximumFailedPasswordsForWipe() чтобы указать, что устройство следует уничтожить после определенного количества попыток неудачных попыток пароля.

Вы проводите данные следующим образом:

Котлин

private lateinit var dpm: DevicePolicyManager
dpm.wipeData(0)

Ява

DevicePolicyManager dpm;
dpm.wipeData(0);

Метод wipeData() принимает в качестве параметра немного маски дополнительных вариантов. В настоящее время значение должно быть 0.

Отключить камеру

Начиная с Android 4.0, вы можете отключить камеру. Обратите внимание, что это не должно быть постоянным отключением. Камера может быть включена/отключена динамически в зависимости от контекста, времени и так далее.

Вы контролируете, отключена ли камера с помощью метода setCameraDisabled() . Например, этот фрагмент устанавливает камеру для включения или отключения на основе настройки флажести:

Котлин

private lateinit var disableCameraCheckbox: CheckBoxPreference
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)

Ява

private CheckBoxPreference disableCameraCheckbox;
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());

Шифрование хранения

Начиная с Android 3.0, вы можете использовать метод setStorageEncryption() для установки политики, требующей шифрования области хранения, где поддерживается.

Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setStorageEncryption(deviceAdminSample, true)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setStorageEncryption(deviceAdminSample, true);

См. Пример API администрирования устройства для полного примера того, как включить шифрование хранения.

Дополнительные образцы кода

Образцы Android CessestrictionForcer и DeviceOwner дополнительно демонстрируют использование API, представленных на этой странице.

,

Устройство администрации устройства . Начиная с Android 9 (уровень API 28), некоторые политики администратора будут помечены как устаревшие при вызове администратора устройства. Мы рекомендуем вам начать готовиться сейчас к этому изменению. Чтобы узнать больше и увидеть параметры миграции, прочитайте дефицит администратора устройства .

Android включает в себя поддержку корпоративных приложений, предлагая API администрирования устройства Android. API ADMERANTION ADMINESS предоставляет функции администрирования устройства на системном уровне. Эти API позволяют вам создавать приложения с защитой, которые полезны в настройках предприятия, в которых ИТ-специалисты требуют богатого контроля над устройствами сотрудников. Например, встроенное приложение для Android Email использовало эти API для улучшения поддержки обмена. Через приложение по электронной почте администраторы Exchange могут обеспечить соблюдение политик паролей, включая буквенно -цифровые пароли или числовые выводы - на разных устройствах. Администраторы также могут дистанционно стереть (то есть, восстановить фабрику по умолчанию) потерянные или украденные телефоны. Пользователи Exchange могут синхронизировать свои электронные письма и данные календаря.

Этот документ предназначен для разработчиков, которые хотят разработать корпоративные решения для устройств на Android. В нем обсуждаются различные функции, предоставляемые API администрирования устройства, для обеспечения более высокой безопасности для устройств сотрудников, которые работают на Android.

Примечание для получения информации о создании контроллера рабочей политики для Android для развертывания работы см. Встройте контроллер политики устройства .

Режим владельца устройства без головы

Android 14 (API -уровень 34) представляет режим пользователя без головного системы (устройства, в которых UserManager.isHeadlessSystemUserMode возвращает true ). В режиме пользователя без головы пользователь систем является пользователем фонового пользователя и опирается на дополнительных пользователей переднего плана для взаимодействия с конечным пользователем. Android 14 также вводит аффилированный режим владельца устройства без головы , который добавляет владельца профиля для всех аффилированных пользователей, кроме пользователя системы, на котором установлен владелец устройства.

В устройствах, настроенных с пользователем системы без головы (где пользователь системы работает в фоновом режиме), только политики устройства являются глобальными по объему (политики, применимые для всех пользователей), применяются к пользователю или пользователям переднего плана. Смотрите addUserRestriction для деталей.

Производители устройств Android могут ссылаться на руководство , опубликованное на Source.android.com.

Обзор API администрирования устройства

Вот примеры типов приложений, которые могут использовать API администрирования устройства:

  • Почтовые клиенты.
  • Приложения безопасности, которые делают удаленное стекло.
  • Управление устройствами и приложениями.

Как это работает?

Вы используете API Admervicent Admency Device для написания приложений администратора устройства, которые пользователи устанавливают на своих устройствах. Приложение администратора устройства обеспечивает желаемую политику. Вот как это работает:

  • Системный администратор записывает приложение администратора устройства, которое обеспечивает соблюдение политик безопасности/локального устройства. Эти политики могут быть жестко кодированы в приложение, или приложение может динамически извлекать политики с стороннего сервера.
  • Приложение установлено на устройствах пользователей. Android в настоящее время не имеет автоматического обеспечения решения. Некоторые из способов, которыми Sysadmin может распространять приложение для пользователей, заключаются в следующем:
    • Гугл Плей.
    • Включение установки из другого магазина.
    • Распределение приложения с помощью других средств, таких как электронная почта или веб -сайты.
  • Система побуждает пользователя включить приложение администратора устройства. Как и когда это происходит, зависит от того, как реализовано приложение.
  • Как только пользователи включили приложение Admin Device, они подвергаются его политикам. Соответствие этим политикам обычно дает преимущества, такие как доступ к конфиденциальным системам и данным.

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

Если пользователь не может соблюдать политики (например, если пользователь устанавливает пароль, который нарушает руководящие принципы), приложение зависит от приложения, чтобы решить, как справиться с этим. Однако, как правило, это приведет к тому, что пользователь не сможет синхронизировать данные.

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

Если устройство содержит несколько приложений для администрации с включенными, самая строгая политика применяется. Нет возможности нацелиться на конкретное приложение администратора.

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

Политика

В настройке предприятия часто бывает так, что устройства сотрудников должны придерживаться строгого набора политик, которые регулируют использование устройства. API администрирования устройства поддерживает политики, перечисленные в таблице 1. Обратите внимание, что API администрирования устройства в настоящее время поддерживает пароли только для блокировки экрана:

Таблица 1. Политики, поддерживаемые API администрирования устройства.

Политика Описание
Пароль включен Требует, чтобы устройства просили PIN -код или пароли.
Минимальная длина пароля Установите необходимое количество символов для пароля. Например, вы можете потребовать PIN -код или пароли, чтобы иметь не менее шести символов.
Требуется буквенно -цифровой пароль Требуется, чтобы пароли имели комбинацию букв и чисел. Они могут включать символические персонажи.
Требуется сложный пароль Требуется, чтобы пароли содержали хотя бы букву, численную цифру и специальный символ. Представлено в Android 3.0.
Минимальные буквы, требуемые в пароле Минимальное количество букв, требуемых в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальные строчные буквы, необходимые в пароле Минимальное количество строчных букв, требуемых в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальные не буквции символов, требуемые в пароле Минимальное количество не буквальных символов, необходимых в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Минимальные численные цифры, необходимые в пароле Минимальное количество численных цифр, необходимых в пароле для всех администраторов или конкретных. Представлено в Android 3.0.
Минимальные символы, необходимые в пароле Минимальное количество символов, необходимых в пароле для всех администраторов или определенных. Представлено в Android 3.0.
Минимальные заглавные буквы, необходимые в пароле Минимальное количество прописных букв, требуемых в пароле для всех администраторов или конкретного. Представлено в Android 3.0.
Тайм -аут истечения срока действия пароля Когда пароль истечет, выражается как дельта в миллисекундах, когда администратор устройства устанавливает время ожидания истечения. Представлено в Android 3.0.
Ограничение истории пароля Эта политика не позволяет пользователям повторно использовать последние уникальные пароли. Эта политика обычно используется в сочетании с setPasswordExpirationTimeout() , которая заставляет пользователей обновлять свои пароли после того, как истекло указанное количество времени. Представлено в Android 3.0.
Максимальные неудачные попытки пароля Определяет, сколько раз пользователь может ввести неправильный пароль, прежде чем устройство будет уничтожать свои данные. API администрирования устройства также позволяет администраторам удаленно сбросить устройство к заводским по умолчанию. Это обеспечивает данные в случае потерянного или украденного устройства.
Максимальная неактивная блокировка времени Устанавливает продолжительность времени с тех пор, как пользователь последний раз касался экрана или нажал кнопку, прежде чем устройство блокирует экран. Когда это произойдет, пользователи должны снова ввести свой PIN -код или пароли, прежде чем они смогут использовать свои устройства и доступ к данным. Значение может быть от 1 до 60 минут.
Требовать шифрования хранения Указывает, что область хранения должна быть зашифрована, если устройство поддерживает его. Представлено в Android 3.0.
Отключить камеру Указывает, что камера должна быть отключена. Обратите внимание, что это не должно быть постоянным отключением. Камера может быть включена/отключена динамически в зависимости от контекста, времени и так далее. Представлен в Android 4.0.

Другие особенности

В дополнение к поддержке политик, перечисленных в приведенной выше таблице, API администрирования устройства позволяет выполнять следующее:

  • Попробуйте пользователя установить новый пароль.
  • Заблокируйте устройство немедленно.
  • Протрите данные устройства (то есть восстановить устройство в его фабрику по умолчанию).

Пример приложения

Примеры, используемые на этой странице, основаны на образце API администрирования устройства, который включен в образцы SDK (доступно через Android SDK Manager) и расположена в вашей системе как <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java .

Пример приложения предлагает демонстрацию функций администратора устройства. Он представляет пользователям пользовательский интерфейс, который позволяет им включить приложение администратора устройства. Как только они включили приложение, они могут использовать кнопки в пользовательском интерфейсе, чтобы сделать следующее:

  • Установите качество пароля.
  • Укажите требования для пароля пользователя, таких как минимальная длина, минимальное количество числовых символов, которые он должен содержать, и так далее.
  • Установите пароль. Если пароль не соответствует указанным политикам, система возвращает ошибку.
  • Установите, сколько неудачных попыток пароля может произойти до того, как устройство будет уничтожено (то есть восстановлено в настройках заводов).
  • Установите, как долго с тех пор истекает пароль.
  • Установите длину истории паролей ( длина относится к количеству старых паролей, хранящихся в истории). Это мешает пользователям повторно использовать один из последних N паролей, которые они использовали ранее.
  • Укажите, что область хранения должна быть зашифрована, если устройство поддерживает его.
  • Установите максимальное количество неактивного времени, которое может исчезнуть до блокировки устройства.
  • Сделайте устройство сразу же заблокировать.
  • Протрите данные устройства (то есть восстановить настройки фабрики).
  • Отключить камеру.

Рисунок 1. Скриншот приложения образца

Разработка приложения администрирования устройства

Системные администраторы могут использовать API администрирования устройства для написания приложения, которое обеспечивает соблюдение удаленного/локального обеспечения безопасности устройств. В этом разделе суммируются шаги, связанные с созданием приложения администрирования устройства.

Создание манифеста

Чтобы использовать API администрирования устройства, манифест приложения должен включать следующее:

  • Подкласс DeviceAdminReceiver , который включает в себя следующее:
    • Разрешение BIND_DEVICE_ADMIN .
    • Способность отвечать на намерение ACTION_DEVICE_ADMIN_ENABLED , выраженное в манифесте в качестве фильтра намерения.
  • Декларация политики безопасности, используемой в метаданных.

Вот выдержка из образца администрирования устройства. Манифест:

<activity android:name=".app.DeviceAdminSample"
            android:label="@string/activity_sample_device_admin">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.SAMPLE_CODE" />
    </intent-filter>
</activity>
<receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver"
        android:label="@string/sample_device_admin"
        android:description="@string/sample_device_admin_description"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
            android:resource="@xml/device_admin_sample" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

Обратите внимание, что:

  • Следующие атрибуты относятся к строковым ресурсам, которые для образца приложения находятся в ApiDemos/res/values/strings.xml . Для получения дополнительной информации о ресурсах см. Ресурсы приложений .
    • android:label="@string/activity_sample_device_admin" относится к читаемой пользователю метке для деятельности.
    • android:label="@string/sample_device_admin" относится к читаемой пользователю метке для разрешения.
    • android:description="@string/sample_device_admin_description" относится к читаемому пользователю описанию разрешения. Descripton, как правило, длиннее и более информативно, чем этикетка.
  • android:permission="android.permission.BIND_DEVICE_ADMIN" - это разрешение, которое должен иметь подкласс DeviceAdminReceiver , чтобы гарантировать, что только система может взаимодействовать с приемником (приложение не может быть предоставлено этому разрешению). Это мешает другим приложениям злоупотреблять приложением администратора вашего устройства.
  • android.app.action.DEVICE_ADMIN_ENABLED - это основное действие, которое подкласс DeviceAdminReceiver должен обрабатывать, чтобы управлять устройством. Это установлено на приемник, когда пользователь включает приложение администратора устройства. Ваш код обычно обрабатывает это в onEnabled() . Для поддержки, приемник также должен требовать разрешения BIND_DEVICE_ADMIN , чтобы другие приложения не могли злоупотреблять им.
  • Когда пользователь разрешает приложение Admin Device, это дает разрешение приемника выполнять действия в ответ на трансляцию конкретных системных событий. Когда возникает подходящее событие, приложение может навязать политику. Например, если пользователь пытается установить новый пароль, который не соответствует требованиям политики, приложение может побудить пользователя выбрать другой пароль, который соответствует требованиям.
  • Избегайте изменения имени приемника после публикации вашего приложения. Если имя в манифесте изменяется, администратор устройства отключается, когда пользователи обновляют приложение. Чтобы узнать больше, см. <receiver> .
  • android:resource="@xml/device_admin_sample" объявляет политики безопасности, используемые в метаданных. Метаданные предоставляют дополнительную информацию, специально предназначенную для администратора устройства, как проанализировано классом DeviceAdminInfo . Вот содержимое device_admin_sample.xml :
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-policies>
    <limit-password />
    <watch-login />
    <reset-password />
    <force-lock />
    <wipe-data />
    <expire-password />
    <encrypted-storage />
    <disable-camera />
  </uses-policies>
</device-admin>

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

Более подробное обсуждение манифестного файла см. Руководство по разработчикам Android .

Реализация кода

API администрирования устройства включает в себя следующие классы:

DeviceAdminReceiver
Базовый класс для реализации компонента администрирования устройства. Этот класс обеспечивает удобство для интерпретации действий необработанных намерений, которые отправляются системой. Ваше приложение для администрирования устройства должно включать подкласс DeviceAdminReceiver .
DevicePolicyManager
Класс для управления политиками применяется на устройстве. Большинство клиентов этого класса, должно быть, опубликовали DeviceAdminReceiver , который пользователь включен в настоящее время. DevicePolicyManager управляет политиками для одного или нескольких экземпляров DeviceAdminReceiver
DeviceAdminInfo
Этот класс используется для указания метаданных для компонента администратора устройства.

Эти классы предоставляют основу для полностью функционального приложения администрирования устройства. В остальной части этого раздела описывается, как вы используете API DeviceAdminReceiver и DevicePolicyManager для написания приложения администратора устройства.

Подкласс DeviceadminReceiver

Чтобы создать приложение администратора устройства, вы должны подкласс DeviceAdminReceiver . Класс DeviceAdminReceiver состоит из серии обратных вызовов, которые запускаются, когда происходят конкретные события.

В своем подкласс DeviceAdminReceiver образец приложение просто отображает уведомление Toast в ответ на конкретные события. Например:

Котлин

class DeviceAdminSample : DeviceAdminReceiver() {

    private fun showToast(context: Context, msg: String) {
        context.getString(R.string.admin_receiver_status, msg).let { status ->
            Toast.makeText(context, status, Toast.LENGTH_SHORT).show()
        }
    }

    override fun onEnabled(context: Context, intent: Intent) =
            showToast(context, context.getString(R.string.admin_receiver_status_enabled))

    override fun onDisableRequested(context: Context, intent: Intent): CharSequence =
            context.getString(R.string.admin_receiver_status_disable_warning)

    override fun onDisabled(context: Context, intent: Intent) =
            showToast(context, context.getString(R.string.admin_receiver_status_disabled))

    override fun onPasswordChanged(context: Context, intent: Intent, userHandle: UserHandle) =
            showToast(context, context.getString(R.string.admin_receiver_status_pw_changed))
...
}

Ява

public class DeviceAdminSample extends DeviceAdminReceiver {

    void showToast(Context context, String msg) {
        String status = context.getString(R.string.admin_receiver_status, msg);
        Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onEnabled(Context context, Intent intent) {
        showToast(context, context.getString(R.string.admin_receiver_status_enabled));
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return context.getString(R.string.admin_receiver_status_disable_warning);
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        showToast(context, context.getString(R.string.admin_receiver_status_disabled));
    }

    @Override
    public void onPasswordChanged(Context context, Intent intent, UserHandle userHandle) {
        showToast(context, context.getString(R.string.admin_receiver_status_pw_changed));
    }
...
}

Включение приложения

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

Процесс включения приложения начинается, когда пользователь выполняет действие, которое запускает намерение ACTION_ADD_DEVICE_ADMIN . В примере примера это происходит, когда пользователь нажимает на флажок «Включить администратор» .

Когда пользователь нажимает флажок «Включить администратор» , дисплей меняется, чтобы попросить пользователя активировать приложение администратора устройства, как показано на рисунке 2.

Рисунок 2. Пример приложения: активация приложения

Ниже приведен код, который выполняется, когда пользователь нажимает на флажок «Включить администратор» . Это влияет на обратный вызов onPreferenceChange() . Этот обратный вызов вызывается, когда значение этого Preference было изменено пользователем и собирается быть установлено и/или сохраняется. Если пользователь включает в себя приложение, дисплей изменяется, чтобы попросить пользователя активировать приложение администратора устройства, как показано на рисунке 2. В противном случае приложение администратора устройства отключено.

Котлин

override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
    if (super.onPreferenceChange(preference, newValue)) return true
    val value = newValue as Boolean
    if (preference == enableCheckbox) {
        if (value != adminActive) {
            if (value) {
                // Launch the activity to have the user enable our admin.
                val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).apply {
                    putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample)
                    putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                            activity.getString(R.string.add_admin_extra_app_text))
                }
                startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN)
                // return false - don't update checkbox until we're really active
                return false
            } else {
                dpm.removeActiveAdmin(deviceAdminSample)
                enableDeviceCapabilitiesArea(false)
                adminActive = false
            }
        }
    } else if (preference == disableCameraCheckbox) {
        dpm.setCameraDisabled(deviceAdminSample, value)
    }
    return true
}

Ява

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
    if (super.onPreferenceChange(preference, newValue)) {
        return true;
    }
    boolean value = (Boolean) newValue;
    if (preference == enableCheckbox) {
        if (value != adminActive) {
            if (value) {
                // Launch the activity to have the user enable our admin.
                Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample);
                intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                        activity.getString(R.string.add_admin_extra_app_text));
                startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);
                // return false - don't update checkbox until we're really active
                return false;
            } else {
                dpm.removeActiveAdmin(deviceAdminSample);
                enableDeviceCapabilitiesArea(false);
                adminActive = false;
            }
        }
    } else if (preference == disableCameraCheckbox) {
        dpm.setCameraDisabled(deviceAdminSample, value);
    }
    return true;
}

Line intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample) утверждает, что mDeviceAdminSample (который является компонентом DeviceAdminReceiver ) является целевой политикой. Эта строка вызывает пользовательский интерфейс, показанный на рисунке 2, который направляет пользователей путем добавления администратора устройства в систему (или позволяет им отклонить его).

Когда приложение необходимо выполнить операцию, которая зависит от включения приложения администратора устройства, оно подтверждает, что приложение активно. Для этого он использует метод DevicePolicyManager isAdminActive() . Обратите внимание, что метод DevicePolicyManager isAdminActive() принимает компонент DeviceAdminReceiver в качестве аргумента:

Котлин

private lateinit var dpm: DevicePolicyManager
...
private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)

Ява

DevicePolicyManager dpm;
...
private boolean isActiveAdmin() {
    return dpm.isAdminActive(deviceAdminSample);
}

Управление политикой

DevicePolicyManager - это открытый класс для управления политиками, применяемыми на устройстве. DevicePolicyManager управляет политиками для одного или нескольких экземпляров DeviceAdminReceiver .

Вы получаете ручку для DevicePolicyManager следующим образом:

Котлин

dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

Ява

DevicePolicyManager dpm =
    (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);

В этом разделе описывается, как использовать DevicePolicyManager для выполнения административных задач:

Установите политики пароля

DevicePolicyManager включает API для настройки и обеспечения соблюдения политики пароля устройства. В API администрирования устройства пароль применяется только к блокировке экрана. В этом разделе описывается общие задачи, связанные с паролем.

Установите пароль для устройства

Этот код отображает пользовательский интерфейс, предлагающий пользователю установить пароль:

Котлин

Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent ->
    startActivity(intent)
}

Ява

Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
startActivity(intent);
Установите качество пароля

Качество пароля может быть одной из следующих констант DevicePolicyManager :

PASSWORD_QUALITY_ALPHABETIC
Пользователь должен ввести пароль, содержащий по крайней мере алфавитные (или другие символы) символы.
PASSWORD_QUALITY_ALPHANUMERIC
Пользователь должен ввести пароль, содержащий как минимум как числовые , так и алфавитные (или другие символы) символы.
PASSWORD_QUALITY_NUMERIC
Пользователь должен ввести пароль, содержащий как минимум числовые символы.
PASSWORD_QUALITY_COMPLEX
Пользователь должен ввести пароль, содержащий хотя бы букву, численную цифру и специальный символ.
PASSWORD_QUALITY_SOMETHING
Политика требует какого -то пароля, но не заботится о том, что это такое.
PASSWORD_QUALITY_UNSPECIFIED
Политика не имеет требований к паролю.

Например, именно так вы установили бы полис пароля, чтобы потребовать буквенно -цифровой пароль:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
Установить требования к контенту пароля

Начиная с Android 3.0, класс DevicePolicyManager включает в себя методы, которые позволяют точно настроить содержимое пароля. Например, вы можете установить политику, в которой говорится, что пароли должны содержать как минимум n заглавных букв. Вот методы для точной настройки содержимого пароля:

Например, этот фрагмент гласит, что пароль должен иметь не менее 2 прописных букв:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwMinUppercase = 2
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwMinUppercase = 2;
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
Установите минимальную длину пароля

Вы можете указать, что пароль должен быть не менее указанной минимальной длины. Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwLength: Int = ...
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwLength;
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
Установить максимальные неудачные попытки пароля

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

Котлин

val dPM:DevicePolicyManager
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val maxFailedPw: Int = ...
...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int maxFailedPw;
 ...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
Установите время ожидания истечения срока действия пароля

Начиная с Android 3.0, вы можете использовать метод setPasswordExpirationTimeout() для установки, когда срок действия пароля будет срок действия, выраженный как дельта в миллисекундах, когда администратор устройства устанавливает время ожидания истечения срока действия. Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwExpiration: Long = ...
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
long pwExpiration;
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
Ограничить пароль на основе истории

Начиная с Android 3.0, вы можете использовать метод setPasswordHistoryLength() чтобы ограничить способность пользователей повторно использовать старые пароли. Этот метод принимает параметр длины , который указывает, сколько старых паролей сохраняется. Когда эта политика активна, пользователи не могут ввести новый пароль, который соответствует последним N -паролям. Это мешает пользователям использовать тот же пароль снова и снова. Эта политика обычно используется в сочетании с setPasswordExpirationTimeout() , которая заставляет пользователей обновлять свои пароли после того, как истекло указанное количество времени.

Например, этот фрагмент запрещает пользователям повторное использование любого из своих последних 5 паролей:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwHistoryLength = 5
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwHistoryLength = 5;
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength);

Установить блокировку устройства

Вы можете установить максимальный период бездействия пользователей, который может произойти до блокировки устройства. Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val timeMs: Long = 1000L * timeout.text.toString().toLong()
...
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
long timeMs = 1000L*Long.parseLong(timeout.getText().toString());
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs);

Вы также можете программно сообщить устройству немедленно блокировать:

Котлин

private lateinit var dpm: DevicePolicyManager
dpm.lockNow()

Ява

DevicePolicyManager dpm;
dpm.lockNow();

Выполните Wipe Data

Вы можете использовать метод DevicePolicyManager wipeData() для сброса устройства в настройки заводов. Это полезно, если устройство потеряно или украдено. Часто решение вытирать устройство является результатом выполнения определенных условий. Например, вы можете использовать setMaximumFailedPasswordsForWipe() чтобы указать, что устройство следует уничтожить после определенного количества попыток неудачных попыток пароля.

Вы проводите данные следующим образом:

Котлин

private lateinit var dpm: DevicePolicyManager
dpm.wipeData(0)

Ява

DevicePolicyManager dpm;
dpm.wipeData(0);

Метод wipeData() принимает в качестве параметра немного маски дополнительных вариантов. В настоящее время значение должно быть 0.

Отключить камеру

Начиная с Android 4.0, вы можете отключить камеру. Обратите внимание, что это не должно быть постоянным отключением. Камера может быть включена/отключена динамически в зависимости от контекста, времени и так далее.

Вы контролируете, отключена ли камера с помощью метода setCameraDisabled() . Например, этот фрагмент устанавливает камеру для включения или отключения на основе настройки флажести:

Котлин

private lateinit var disableCameraCheckbox: CheckBoxPreference
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)

Ява

private CheckBoxPreference disableCameraCheckbox;
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());

Шифрование хранения

Начиная с Android 3.0, вы можете использовать метод setStorageEncryption() для установки политики, требующей шифрования области хранения, где поддерживается.

Например:

Котлин

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setStorageEncryption(deviceAdminSample, true)

Ява

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setStorageEncryption(deviceAdminSample, true);

См. Пример API администрирования устройства для полного примера того, как включить шифрование хранения.

Дополнительные образцы кода

Образцы Android CessestrictionForcer и DeviceOwner дополнительно демонстрируют использование API, представленных на этой странице.