设备管理员弃用。从 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 目前仅支持屏幕锁定的密码。
策略 | 描述 |
---|---|
启用密码 | 要求设备提示输入 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* 个密码之一。
- 指定存储区域应加密,如果设备支持的话。
- 设置设备锁定之前可以经过的最大非活动时间。
- 立即使设备锁定。
- 擦除设备数据(即恢复出厂设置)。
- 禁用摄像头。
开发设备管理应用
系统管理员可以使用设备管理 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
- 此类用于指定设备管理员组件的元数据。
这些类为功能齐全的设备管理应用提供了基础。本节的其余部分介绍了如何使用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
意图的操作时,启用应用的过程开始。在示例应用中,当用户点击“启用管理员”复选框时会发生这种情况。
当用户点击“启用管理员”复选框时,显示屏会更改为提示用户激活设备管理应用,如图 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个大写字母。以下是用于微调密码内容的方法:
setPasswordMinimumLetters()
setPasswordMinimumLowerCase()
setPasswordMinimumUpperCase()
setPasswordMinimumNonLetter()
setPasswordMinimumNumeric()
setPasswordMinimumSymbols()
例如,此代码片段规定密码必须至少包含 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 AppRestrictionEnforcer 和 DeviceOwner 示例进一步演示了本页介绍的 API 的用法。