设备管理概述

设备管理员弃用。从 Android 9(API 级别 28)开始,某些管理员策略在由设备管理员调用时将被标记为已弃用。我们建议您现在开始为此更改做好准备。要了解详细信息并查看迁移选项,请阅读 设备管理员弃用

Android 通过提供 Android 设备管理 API 来支持企业应用。设备管理 API 在系统级别提供设备管理功能。这些 API 允许您创建安全感知应用,这些应用在企业环境中非常有用,在企业环境中,IT 专业人员需要对员工设备进行丰富的控制。例如,内置的 Android 邮件应用已利用这些 API 来改进 Exchange 支持。通过邮件应用,Exchange 管理员可以在设备上强制执行密码策略,包括字母数字密码或数字 PIN。管理员还可以远程擦除(即恢复出厂设置)丢失或被盗的手机。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目前还没有自动配置解决方案。系统管理员向用户分发应用的一些方法如下:
    • Google Play。
    • 启用从其他商店安装。
    • 通过其他方式分发应用,例如电子邮件或网站。
  • 系统会提示用户启用设备管理应用。这如何以及何时发生取决于应用的实现方式。
  • 一旦用户启用设备管理应用,他们就会受到其策略的约束。遵守这些策略通常会带来好处,例如访问敏感系统和数据。

如果用户没有启用设备管理应用,它将保留在设备上,但处于非活动状态。用户不会受到其策略的约束,反之也不会获得应用的任何好处——例如,他们可能无法同步数据。

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

如果设备尝试连接到需要设备管理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管理器获取),并位于您的系统上的 <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java

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

  • 设置密码质量。
  • 指定用户密码的要求,例如最小长度、必须包含的数字字符的最小数量等。
  • 设置密码。如果密码不符合指定的策略,系统将返回错误。
  • 设置设备擦除(即恢复出厂设置)之前可以发生的密码输入错误次数。
  • 设置密码从现在开始多久过期。
  • 设置密码历史记录长度(*长度*指的是存储在历史记录中的旧密码的数量)。这可以防止用户重复使用他们之前使用的最后 *n* 个密码之一。
  • 指定存储区域应加密,如果设备支持的话。
  • 设置设备锁定之前可以经过的最大非活动时间。
  • 立即使设备锁定。
  • 擦除设备的数据(即恢复出厂设置)。
  • 禁用摄像头。

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

开发设备管理应用

系统管理员可以使用设备管理API编写一个应用,以执行远程/本地设备安全策略执行。本节总结了创建设备管理应用涉及的步骤。

创建清单

要使用设备管理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_ENABLEDDeviceAdminReceiver 子类必须处理的主要操作,才能被允许管理设备。当用户启用设备管理应用时,会将其设置为接收器。您的代码通常在 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
用于管理设备上实施的策略的类。此类的多数客户端必须已发布一个用户当前启用的 DeviceAdminReceiverDevicePolicyManager 管理一个或多个 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 意图的操作时,启用应用的过程就开始了。在示例应用中,当用户点击“启用管理员”复选框时就会发生这种情况。

当用户点击“启用管理员”复选框时,显示屏会更改为提示用户激活设备管理应用,如图 2 所示。

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

以下是用户点击“启用管理员”复选框时执行的代码。这将触发 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。在设备管理 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);

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

其他代码示例

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