设备管理概览

设备管理弃用。从 Android 9(API 级别 28)开始,当设备管理员调用某些管理员政策时,这些政策将被标记为已弃用。我们建议您立即着手准备应对此项变更。如需了解详情并查看迁移选项,请参阅 设备管理员弃用。

Android 通过提供 Android Device Administration API 来支持企业应用。Device Administration API 在系统级别提供设备管理功能。借助这些 API,您可以创建在企业环境中非常实用的安全感知型应用,在这些环境中,IT 专业人员需要对员工设备进行丰富的控制。例如,内置的 Android 电子邮件应用已利用这些 API 来改善 Exchange 支持。通过该电子邮件应用,Exchange 管理员可以跨设备强制执行密码政策(字母数字密码或数字 PIN 码都算作密码)。管理员还可以远程清除(即恢复出厂默认设置)丢失或被盗手机上的数据。Exchange 用户可以同步 他们的电子邮件和日历数据

本文档面向希望为 Android 设备开发企业解决方案的开发者。本文讨论了 Device Administration API 提供的各种功能,这些功能可为由 Android 提供支持的员工设备提供更强大的安全性。

注意:如需了解如何为 Android for Work 部署构建工作政策控制器,请参阅构建设备政策控制器。

无头设备所有者模式

Android 14(API 级别 34)引入了无头系统用户模式(UserManager.isHeadlessSystemUserMode 返回 true 的设备)。在无头系统用户模式下,系统用户是后台用户,需要依赖其他前台用户与最终用户互动。Android 14 还引入了无头设备所有者关联模式,该模式会为除设置了设备所有者的系统用户之外的所有关联用户添加一个配置文件所有者。

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

Android 设备制造商可以参考 source.android.com 上发布的指南。

Device Administration API 概览

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

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

工作原理

您可以使用 Device Administration API 编写用户在其设备上安装的设备管理应用。设备管理应用会强制执行所需的政策。其工作原理如下:

  • 系统管理员编写一个设备管理应用,用于强制执行远程/本地设备安全政策。这些政策可以硬编码到应用中,也可以由应用从第三方服务器动态提取。
  • 该应用已安装在用户的设备上。Android 目前没有自动配置解决方案。系统管理员向用户分发应用的一些方式如下:
    • Google Play
    • 从其他商店启用安装。
    • 通过其他方式分发应用,例如电子邮件或网站。
  • 系统会提示用户启用设备管理应用。具体方式和时间取决于应用的实现方式。
  • 用户启用设备管理应用后,便会受其政策约束。遵守这些政策通常会带来好处,例如可以访问敏感系统和数据。

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

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

如果设备尝试连接到需要 Device Administration API 不支持的政策的服务器,则系统将不允许该连接。Device Administration API 目前不允许部分配置。换言之,如果设备(例如旧版设备)不支持所有规定的政策,则无法允许该设备连接。

如果设备包含多个已启用的管理应用,系统会强制执行最严格的政策。无法定位到特定管理应用。

如需卸载现有的设备管理员应用,用户需要先取消注册该应用作为管理员。

政策

在企业环境中,员工设备通常必须遵守一套严格的设备使用政策。Device Administration API 支持表 1 中列出的政策。请注意,Device Administration 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 中引入。
错误密码尝试次数上限 指定用户在设备擦除其数据之前可以输入错误密码的次数。Device Administration API 还允许管理员远程将设备恢复出厂默认设置。这样可以在设备丢失或被盗时保护数据。
最长不活动时间锁定 设置设备锁定屏幕前,用户最后一次触摸屏幕或按下按钮后的时长。发生这种情况时,用户需要再次输入 PIN 码或密码,然后才能使用设备和访问数据。该值可介于 1 到 60 分钟之间。
需要存储加密 指定应加密存储区域(如果设备支持)。 在 Android 3.0 中引入。
停用摄像头 指定应停用相机。请注意,这不一定是永久停用。摄像头可以根据情境、时间等动态启用/停用。在 Android 4.0 中引入。

其他功能

除了支持上表中列出的政策之外,Device Administration API 还允许您执行以下操作:

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

示例应用

本页面中使用的示例基于设备管理 API 示例,该示例包含在 SDK 示例中(可通过 Android SDK 管理器获取),位于系统中的 <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java。

该示例应用演示了设备管理功能。它向用户提供了一个界面,用户可以通过该界面启用设备管理应用。启用应用后,用户可以使用界面中的按钮执行以下操作:

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

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

开发设备管理应用

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

创建清单

如需使用 Device Administration 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" 是指 activity 的用户可读标签。
    • 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
用于实现设备管理组件的基类。此类可方便您解读系统发送的原始 intent 操作。您的设备管理应用必须包含 DeviceAdminReceiver 子类。
DevicePolicyManager
用于管理设备上强制执行的政策的类。此类的多数客户端必须已发布用户当前启用的 DeviceAdminReceiver。DevicePolicyManager 管理一个或多个 DeviceAdminReceiver 实例的政策
DeviceAdminInfo
此类用于为设备管理员组件指定元数据。

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

对 DeviceAdminReceiver 进行子类化

如需创建设备管理应用,您必须将 DeviceAdminReceiver 子类化。DeviceAdminReceiver 类由一系列在发生特定事件时触发的回调组成。

在其 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) 行指出 mDeviceAdminSample(DeviceAdminReceiver 组件)是目标政策。此行会调用图 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 管理一个或多个 DeviceAdminReceiver 实例的政策。

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

Kotlin

dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

Java

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

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

设置密码政策

DevicePolicyManager 包含用于设置和强制执行设备密码政策的 API。在 Device Administration 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 Administration API 示例。

更多代码示例

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