设备管理概览

设备管理弃用。从 Android 9 开始 (API 级别 28),那么当 由设备管理员调用我们建议您立即着手准备应对此项变更。学习内容 以及迁移选项,请参阅 <ph type="x-smartling-placeholder"></ph> 设备管理服务的弃用

Android 通过提供 Android Device 管理 API。Device Admin API 可为设备提供 在系统级设置管理功能借助这些 API 这种注重安全性的应用,在企业环境中十分有用,而 IT 部门 专业人员需要对员工设备进行大量控制。例如, 内置的 Android 电子邮件应用利用这些 API 提高了 Exchange 支持。Exchange 管理员可以通过电子邮件应用 强制执行密码政策 - 包括字母数字密码或数字密码 跨设备 PIN 码管理员还可以远程清除(即 恢复出厂默认设置)。Exchange 用户可以同步 电子邮件和日历数据。

本文档面向想要开发 解决方案。其中介绍了 由 Device 管理 API 提供,以提供更强大的安全保护, 搭载 Android 的员工设备。

备注:有关构建工作政策的信息 适用于 Android for Work 部署的控制器,请参阅 构建设备政策控制器

无头设备所有者模式

Android 14(API 级别 34)引入了无头系统用户模式 哪个 UserManager.isHeadlessSystemUserMode 返回 true)。在无头系统用户模式下,系统用户是 并依赖其他前台用户来服务最终用户 互动Android 14 还引入了 无头设备所有者关联模式 这会将一个配置文件所有者 关联用户 设置设备所有者的系统用户除外。

在配置了无头系统用户(即系统用户 在后台运行),仅限全局范围内的设备政策 (适用于所有用户的政策)会应用于前台用户 或用户。请参阅 addUserRestriction 了解详情。

<ph type="x-smartling-placeholder">

Android 设备制造商可以参阅 指南 发布在 source.android.com 上

Device Administration API 概览

下面的示例展示了可能使用 Device Administration API 的应用类型:

  • 电子邮件客户端。
  • 执行远程清除的安全应用。
  • 设备管理服务和应用。

工作原理

您可以使用设备管理 API 来编写 在其设备上安装的您的应用设备管理应用会强制执行所需的 政策。具体方法如下:

  • 系统管理员应用可以编写一个设备管理应用, 远程/本地设备安全政策这些政策可以硬编码到 或者应用可从第三方动态提取政策 服务器。
  • 该应用已安装在用户的设备上。Android 确实 目前还没有自动配置解决方案。系统管理员可能会通过多种方式 请按以下步骤向用户分发应用: <ph type="x-smartling-placeholder">
      </ph>
    • Google Play。
    • 从其他商店启用安装。
    • 通过其他方式分发应用,例如电子邮件或网站。
  • 系统会提示用户启用设备管理应用。方法 具体发生时间取决于应用的实现方式。
  • 用户启用设备管理应用后,受制于 政策遵守这些政策通常会带来诸多好处,例如: 访问敏感系统和数据。

如果用户未启用设备管理应用,则该应用会保留在设备上,但处于不活动状态。用户将不会受到其政策的约束,相反也不会获得该应用的任何优势(例如,他们可能无法同步数据)。

如果用户未能遵守政策(例如,如果用户设置了 密码),将由应用决定 如何处理?不过,这通常会导致用户 无法同步数据。

如果设备尝试连接到不需要政策的服务器 ,则连接不会 。设备管理 API 目前不支持部分 预配。换言之,如果设备(例如旧设备) 并非支持所有既定政策,也就无法允许 设备进行连接。

如果设备包含多个已启用的管理应用,则最严格的政策是 强制执行。无法指定特定管理员 应用。

要卸载现有的设备管理应用,用户需要执行以下操作: 首先,以管理员身份取消注册该应用。

政策

在企业环境中,员工设备通常需要 遵守有关设备使用行为的一系列严格政策。通过 Device Admin API 支持表 1 中列出的政策。 请注意,Device 管理 API 目前仅支持用于屏幕的密码 锁定:

表 1. Device Administration API 支持的政策。

政策 说明
密码已启用 需要设备要求输入 PIN 码或密码。
密码最小长度 设置密码所需的字符数。例如,您 可以要求 PIN 码或密码至少包含 6 个字符。
需要输入字母数字密码 要求密码具有 由字母和数字组合而成可以包含符号字符。
需要输入复杂的密码 要求密码必须包含至少一个字母、一个数字和一个特殊符号。此属性是在 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,您可以执行以下操作:

  • 提示用户设置新密码。
  • 立即锁定设备。
  • 清除设备的数据(也就是将设备恢复到出厂默认设置)。

示例应用

本页面中使用的示例基于 Device 管理 API ,后者包含在 SDK 示例(可通过 Android SDK 管理器),并在您的系统上定位为 <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java

该示例应用演示了设备管理功能。它会向用户显示 其界面允许用户启用设备管理应用。一次 已启用应用后,就可以使用界面中的按钮 执行以下操作:

  • 设置密码质量。
  • 指明对用户密码的要求,例如最小长度、最小数量 必须包含的数字字符等等。
  • 设置密码。如果密码不符合指定的 政策时,系统会返回错误。
  • 设置在擦除设备之前可以尝试密码失败的次数 (即恢复出厂设置)。
  • 设置从现在起密码多久会过期。
  • 设置密码历史记录长度(长度是指历史记录中存储的旧密码数量)。 这样可以防止用户重复使用 他们之前使用的最近 n 个密码。
  • 指定应对存储区域进行加密(如果设备支持)。
  • 设置设备处于非活动状态的时间上限 锁定。
  • 立即锁定设备。
  • 清除设备的数据(即恢复出厂设置)。
  • 停用相机。

图 1. 示例应用的屏幕截图

开发设备管理应用

系统管理员可以使用 Device 管理 API 来编写应用 强制执行远程/本地设备安全政策。此部分 总结了创建设备管理应用所涉及的步骤 应用。

创建清单

要使用 Device 管理 API,应用的 清单中必须包含以下内容:

以下代码摘录自设备管理示例清单:

<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 开发者指南

实现代码

Device Administration API 包含以下类:

DeviceAdminReceiver
用于实现设备管理组件的基类。这个类提供了 以便于解释由 Android SDK 发送的原始 intent 操作, 系统。您的设备管理应用必须包含 DeviceAdminReceiver 子类。
DevicePolicyManager
用于管理设备上强制执行的政策的类。的大多数客户 此类必须已发布一个 DeviceAdminReceiver, 目前已启用。DevicePolicyManager管理以下各项的政策: 一个或多个 DeviceAdminReceiver 实例
DeviceAdminInfo
此类用于指定元数据 。

这些类为构建功能齐全的设备管理应用奠定了基础。 本部分的其余内容介绍如何使用 DeviceAdminReceiverDevicePolicyManager API,用于编写设备管理应用。

对 DeviceAdminReceiver 进行子类化

如需创建设备管理应用,您必须创建子类 DeviceAdminReceiverDeviceAdminReceiver 类 包含一系列回调,这些回调会在发生特定事件时触发 。

在其 DeviceAdminReceiver 子类中,示例应用 仅显示一个 Toast 通知,以响应特定的 事件。例如:

Kotlin

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))
...
}

Java

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 的操作 intent。在 当用户点击启用 管理员复选框。

当用户点击启用管理员复选框后, 以提示用户激活设备管理应用,如图所示 2.

图 2. 示例应用:激活应用

下面显示了用户点击 Enable Admin 复选框时执行的代码。这样做的效果是 onPreferenceChange() 回调。当用户已更改此 Preference 的值以及要设置和/或保留该值时,系统将调用此回调。如果用户正在启用应用,则显示屏 以提示用户激活设备管理应用,如图所示 2.否则,系统会停用设备管理应用。

Kotlin

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
}

Java

@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) 表明,mDeviceAdminSampleDeviceAdminReceiver 组件)是目标政策。 此行会调用图 2 所示的界面,该界面会引导用户 将设备管理员添加到系统中(或允许管理员拒绝添加)。

当应用需要执行视情况而定的操作时 设备管理应用,系统会确认该应用 活动状态。为此,它使用 DevicePolicyManager 方法 isAdminActive()。请注意,DevicePolicyManager isAdminActive() 方法接受 DeviceAdminReceiver 组件作为其参数:

Kotlin

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

Java

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

管理政策

DevicePolicyManager 是一个用于管理政策的公共类 实施限制。DevicePolicyManager 可管理 1 个应用的政策 一个或多个 DeviceAdminReceiver 实例。

您会获得 DevicePolicyManager 的句柄,如下所示:

Kotlin

dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

Java

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

本部分介绍如何使用 DevicePolicyManager 执行 管理任务:

设置密码政策

DevicePolicyManager 包含用于设置和强制执行 设备密码政策。在 Device 管理 API 中,密码仅适用于 屏幕锁定。本部分介绍了常见的密码相关任务。

为设备设置密码

此代码显示了提示用户设置密码的界面:

Kotlin

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

Java

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
此政策对密码没有任何要求。

下面的示例展示了如何设置密码政策,以要求提供字母数字密码:

Kotlin

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

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
设置密码内容要求

从 Android 3.0 开始,DevicePolicyManager 类 包括可让您微调密码内容的方法。对于 例如,您可以设置一项政策,规定密码必须至少包含 n 个大写字母。以下是优化密码的 内容:

例如,以下代码段指明密码必须包含至少 2 个大写字母:

Kotlin

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

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwMinUppercase = 2;
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
设置密码最小长度

您可以指定密码必须至少达到指定的最小值 。例如:

Kotlin

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

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwLength;
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
设置错误密码尝试次数上限

您可以设置在发生密码输入错误之前, 设备数据被擦除(即恢复出厂设置)。例如:

Kotlin

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

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int maxFailedPw;
 ...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
设置密码过期超时时间

从 Android 3.0 开始,您可以使用 setPasswordExpirationTimeout() 方法,用于设置密码何时过期,表示为从设备管理员设置过期超时时间起的增量值(以毫秒为单位)。例如:

Kotlin

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

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
long pwExpiration;
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
根据历史记录限制密码

从 Android 3.0 开始,您可以使用 setPasswordHistoryLength() 来限制 能够重复使用旧密码此方法需要一个“length” 参数,用于指定有多少旧 会存储密码。启用此政策后,用户将无法输入新的 与最近 n 个密码匹配的密码。这可防止 防止用户反复使用相同的密码此政策通常用于 与 setPasswordExpirationTimeout(), 这会迫使 在指定时间过后更新其密码。

例如,此代码段禁止用户重复使用最近使用过的 5 个密码中的任意一个:

Kotlin

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

Java

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

设置设备锁定

您可以设置 设备锁定。例如:

Kotlin

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

Java

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

您还能够以编程方式告知设备立即锁定:

Kotlin

private lateinit var dpm: DevicePolicyManager
dpm.lockNow()

Java

DevicePolicyManager dpm;
dpm.lockNow();

执行数据清除

您可以使用 DevicePolicyManager 方法 wipeData()将设备恢复出厂设置。有用 如果设备丢失或被盗。通常情况下,擦除设备的决定是 是满足特定条件的结果。例如,您可以使用 setMaximumFailedPasswordsForWipe(),用于声明设备应 在密码尝试失败特定次数后被擦除。

清除数据的方法如下所示:

Kotlin

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

Java

DevicePolicyManager dpm;
dpm.wipeData(0);

wipeData() 方法将作为 参数是其他选项的位掩码。目前,该值必须为 0。

停用相机

从 Android 4.0 开始,您可以停用相机。请注意,这不一定是永久停用。可以根据具体情况、时间等因素动态启用/停用相机。

您可以使用 setCameraDisabled() 方法结合使用。例如,以下代码段根据复选框设置将相机设置为启用或停用:

Kotlin

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

Java

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

存储加密

从 Android 3.0 开始,您可以使用 setStorageEncryption() 方法设置要求对存储区域进行加密的政策(如果支持)。

例如:

Kotlin

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

Java

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

有关如何启用存储加密的完整示例,请参阅 Device 管理 API 示例。

更多代码示例

Android AppRestrictionEnforcerDeviceOwner 示例进一步演示了如何使用本页介绍的 API。