设备管理概览

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

Android 通过提供 Android 设备管理 API 来支持企业应用。设备管理 API 在系统级别提供设备管理功能。这些 API 允许您创建具有安全意识的应用,这些应用在企业环境中非常有用,其中 IT 专业人员需要对员工设备进行丰富的控制。例如,内置的 Android 电子邮件应用已利用这些 API 来改进 Exchange 支持。通过电子邮件应用,Exchange 管理员可以在设备上强制执行密码政策(包括字母数字密码或数字 PIN)。管理员还可以远程擦除(即恢复出厂设置)丢失或被盗的手机。Exchange 用户可以同步他们的电子邮件和日历数据。

本文档面向希望为 Android 设备开发企业解决方案的开发者。它讨论了设备管理 API 提供的各种功能,以增强由 Android 驱动的员工设备的安全性。

注意 有关为 Android for Work 部署构建工作政策控制器(Work Policy Controller)的信息,请参阅构建设备政策控制器

无头设备所有者模式

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 Manager 获取),并在您的系统上位于 <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
用于实现设备管理组件的基类。此类提供了解释系统发送的原始 intent 操作的便利。您的设备管理应用必须包含一个 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 intent 的操作。在示例应用中,当用户点击启用管理员复选框时会发生这种情况。

当用户点击启用管理员复选框时,显示屏会更改以提示用户激活设备管理员应用,如图 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 的使用。