本页面简要介绍了企业 API、功能和行为。 Android 9 中提供的变更。
工作资料界面
Android 9(API 级别 28)默认包含界面更改 可帮助用户区分个人应用和工作应用。设备制造商 如果支持,工作标签页和个人标签页。 我们还使设备用户能够更轻松地开启和关闭工作资料,具体方法如下: 在启动器的工作标签页中添加一个开关。
![](https://developer.android.google.cn/static/images/about/versions/pie/p-work-profile.jpg?authuser=7&hl=el)
配置工作资料和受管理设备时,Android 9 包含 动画插图,以帮助设备用户了解这些功能。
跨资料切换应用
Android 9 包含一些 API,用于在
以帮助用户在账号之间切换。例如,电子邮件应用可以
提供一个界面,让用户可以在个人资料和工作单位之间进行切换
个人资料访问两个电子邮件账号。所有应用都可以调用这些 API 来启动
同一应用的主 activity(如果已安装在其他资料中)。接收者
在应用中添加跨资料账号切换功能,请按以下步骤操作:
方法的
CrossProfileApps
类:
- 调用
getTargetUserProfiles()
以获取 配置文件,以便在其中启动应用的另一个实例。此方法会检查 应用安装在个人资料中。 - 调用
getProfileSwitchingIconDrawable()
来获取可用于代表其他个人资料的图标。 - 调用
getProfileSwitchingLabel()
以获取 提示用户切换资料的本地化文本。 - 调用
startMainActivity()
以启动 在其他资料中发布应用
检查您要启动的主 activity 是否已在应用
包含 ACTION_MAIN
intent 操作,并且包含
CATEGORY_LAUNCHER
intent 类别。
以编程方式开启或关闭工作资料
默认启动器(或具有 MANAGE_USERS
或
MODIFY_QUIET_MODE
)可通过以下方式开启或关闭工作资料:
UserManager.requestQuietModeEnabled()
。您可以
检查返回值,以了解用户是否需要确认其
更改凭据因为这种变化可能不会发生
您可以立即聆听
ACTION_MANAGED_PROFILE_AVAILABLE
或
ACTION_MANAGED_PROFILE_UNAVAILABLE
广播,以了解何时更新界面。
您的应用可以通过调用
UserManager.isQuietModeEnabled()
。
将任何应用锁定到设备上
从 Android 9 开始,次要用户的设备所有者和资料所有者 可以将任何应用置于锁定任务模式,从而将该应用锁定在设备屏幕上。 以前,应用开发者必须添加对锁定任务的支持 模式。Android 9 还扩展了锁定任务 用于非关联次要用户的个人资料所有者的 API。请按以下步骤操作 将应用锁定到屏幕:
- 调用
DevicePolicyManager.setLockTaskPackages()
以 将应用列入许可名单以进行锁定任务模式。 - 调用
ActivityOptions.setLockTaskEnabled()
以启动 已列入许可名单的应用进入锁定任务模式。
如需让应用进入锁定任务模式,请从锁定任务模式中移除该应用
列入许可名单
DevicePolicyManager.setLockTaskPackages()
。
启用系统界面功能
启用锁定任务模式后,设备所有者和资料所有者可以启用
通过调用
DevicePolicyManager.setLockTaskFeatures()
,并将
位字段:
LOCK_TASK_FEATURE_NONE
LOCK_TASK_FEATURE_SYSTEM_INFO
LOCK_TASK_FEATURE_HOME
LOCK_TASK_FEATURE_NOTIFICATIONS
只能与LOCK_TASK_FEATURE_HOME
结合使用。LOCK_TASK_FEATURE_KEYGUARD
LOCK_TASK_FEATURE_OVERVIEW
只能与LOCK_TASK_FEATURE_HOME
结合使用。LOCK_TASK_FEATURE_GLOBAL_ACTIONS
您可以调用 DevicePolicyManager.getLockTaskFeatures()
获取设备在锁定任务模式时可用的功能列表
。当设备退出锁定任务模式时,会恢复到
其他设备政策
不显示错误对话框
在某些环境中,例如零售演示或公共信息
您可能不想向用户显示错误对话框。设备政策
控制器 (DPC) 可以禁止针对崩溃或无响应显示系统错误对话框
添加
DISALLOW_SYSTEM_ERROR_DIALOGS
位用户
限制。设备所有者应用此限制时,会影响所有对话框
但只有主要或次要用户所显示的错误对话框会被阻止
当商家资料所有者应用限制时触发。此限制不
会影响工作资料。
在 Android 9 中,以沉浸式全屏运行的应用 模式不会在 锁定任务模式。提醒气泡是(首次启动时)向用户显示的面板 介绍了如何退出沉浸模式。
在专用设备上支持多用户
Android 9 引入了临时用户的概念,用于提供专用的 设备(以前称为 COSU 设备)。临时用户 短期用户,适用于多名用户共享单个应用的情况 专用设备这包括设备(例如图书馆)上的公开用户会话 酒店签到机,以及固定式会话之间的 一组设备用户,例如轮班员工。
临时用户应在后台创建。它们是作为 次要用户(以及关联的应用和 数据)。要创建 临时用户,设备所有者可以:
- 调用时设置
MAKE_USER_EPHEMERAL
标志DevicePolicyManager.createAndManageUser()
。 - 调用
DevicePolicyManager.startUserInBackground()
以在后台启动临时用户
请注意,以 Android 9 为目标平台的应用应捕获
UserManager.UserOperationException
(通话时)
createAndManageUser()
。调用异常的
getUserOperationResult()
方法,用于了解
未能创建用户。
接收事件通知
DeviceAdminReceiver
会收到以下通知:
以下事件:
onUserStarted()
:在用户启动时调用。onUserSwitched()
:在用户切换时调用 。onUserStopped()
:随一起调用onUserRemoved()
,在用户停止或记录日志时发出通知 输出。
向用户显示事件消息
设备所有者可以配置在用户使用设备时向其显示的消息 开始和结束会话:
- 使用
DevicePolicyManager.setStartUserSessionMessage()
设置在用户会话开始时向用户显示的消息。接收者 检索消息, 调用DevicePolicyManager.getStartUserSessionMessage()
。 - 使用
DevicePolicyManager.setEndUserSessionMessage()
设置在用户会话结束时向用户显示的消息。接收者 检索消息, 调用DevicePolicyManager.getEndUserSessionMessage()
。
退出和停止用户
设备所有者可以使用
DevicePolicyManager.setLogoutEnabled()
:用于指定是否
次要用户可退出登录。要检查是否启用了退出登录,请调用
DevicePolicyManager.isLogoutEnabled()
。
次要用户的个人资料所有者可以拨打电话
DevicePolicyManager.logoutUser()
,用于停止次要用户并
切换回主要用户。
设备所有者可以使用 DevicePolicyManager.stopUser()
来停止
指定的次要用户。
软件包缓存
为了简化具有一组固定用户的共享设备上的用户配置, 例如用于轮班员工的设备,则可以缓存 多用户会话所需的资源:
致电
DevicePolicyManager.setKeepUninstalledPackages()
用于指定要保留为 APK 的软件包列表。要检索这些元素的列表, 包裹, 调用DevicePolicyManager.getKeepUninstalledPackages()
。调用
DevicePolicyManager.installExistingPackage()
通过setKeepUninstalledPackages()
。
其他方法和常量
Android 9 还包含以下方法和常量,以进一步支持 共用设备上的用户会话:
DevicePolicyManager.getSecondaryUsers()
会获取 所有次要用户DISALLOW_USER_SWITCH
是您可以设置的用户限制 通过调用DevicePolicyManager.addUserRestriction()
以禁止用户切换。LEAVE_ALL_SYSTEM_APPS_ENABLED
是一个标志 可用于DevicePolicyManager.createAndManageUser()
。设置完毕后, 用户配置期间不会停用系统应用。UserManager.UserOperationException
由以下原因抛出:DevicePolicyManager.createAndManageUser()
(当无法创建用户时), 包含失败原因的异常。
清除软件包数据并移除账号
设备所有者和个人资料所有者可以拨打电话
clearApplicationUserData()
,用于清除用户数据
特定软件包要从以下位置移除账号:
AccountManager
,设备和资料所有者可以拨打电话
removeAccount()
。
用户限制和加强对设置的控制
Android 9 引入了一组针对 DPC 的用户限制,以及 在设备上配置 APN、时间和时区以及系统设置。
配置 APN
设备所有者可以在
DevicePolicyManager
类,用于在
设备:
addOverrideApn()
updateOverrideApn()
removeOverrideApn()
getOverrideApns()
setOverrideApnEnabled()
isOverrideApnEnabled()
配置时间和时区
设备所有者可以在
DevicePolicyManager
类,用于设置时间和时区
:
针对重要设置强制执行用户限制
Android 9 添加了用户限制,以停用系统功能和设置。接收者
添加限制, 调用
将DevicePolicyManager.addUserRestriction()
替换为以下其中一项
以下 UserManager
常量:
DISALLOW_AIRPLANE_MODE
DISALLOW_AMBIENT_DISPLAY
DISALLOW_CONFIG_BRIGHTNESS
DISALLOW_CONFIG_DATE_TIME
DISALLOW_CONFIG_LOCATION
DISALLOW_CONFIG_SCREEN_TIMEOUT
DISALLOW_PRINTING
如果状态为 DISALLOW_CONFIG_BRIGHTNESS
且
强制执行 DISALLOW_CONFIG_SCREEN_TIMEOUT
设备所有者仍然可以设置屏幕
亮度、屏幕亮度
模式和屏幕超时设置
在设备上使用 API
DevicePolicyManager.setSystemSetting()
。
按流量计费的流量
设备所有者和资料所有者可以阻止应用使用设备的
按流量计费的数据网络当用户
对因费用、流量限制或电池电量和
性能问题要阻止应用使用按流量计费的网络,请调用
DevicePolicyManager.setMeteredDataDisabledPackages()
来传递软件包名称列表要检索当前受限的应用,请调用
DevicePolicyManager.getMeteredDataDisabledPackages()
。
如需详细了解 Android 中的按流量计费的数据,请参阅优化网络流量 用法。
迁移设备政策控制器 (DPC)
设备政策控制器 (DPC) 可以转让设备所有权或 向另一个设备政策控制器 (DPC) 发送工作资料。您可以转让所有权以转移某些功能 Android 管理 API 来从 Google Cloud 迁移设备, 或帮助 IT 管理员迁移到您的 EMM。因为您只是 设备政策控制器 (DPC) 所有权发生变化时,您将无法使用此功能 管理,例如从受管理的设备迁移到工作资料,或 反之亦然。
您可以使用设备管理政策 XML 资源执行以下操作:
指明此版本的 DPC 支持迁移。目标设备政策控制器 (DPC)
表示可以通过添加名为
<support-transfer-ownership>
。以下示例说明了如何在
设备政策控制器 (DPC) 的设备管理 XML 文件:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<support-transfer-ownership />
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
</uses-policies>
</device-admin>
希望将所有权移交给新 DPC 应用的 DPC 可以检查目标 DPC 是否
版本通过调用 DeviceAdminInfo
方法来支持迁移
supportsTransferOwnership()
。转移前
则源设备政策控制器 (DPC) 有责任通过
比较应用签名PackageManager
类包括
方法配合使用代码签名签名。
Android 通过所有权来维护源 DPC 的系统和用户政策
传输:DPC 不需要迁移这些内容。源 DPC 可将自定义数据传递给
在 PersistableBundle
中使用键值对指定目标 DPC。在
则目标 DPC 可通过调用
DevicePolicyManager.getTransferOwnershipBundle()
。
转让受管设备或工作资料所有权的步骤如下 相同:
- 源 DPC 检查目标 DPC 的版本是否支持迁移并 确认目标 DPC 的应用签名与预期值匹配。
- 来源 DPC 调用
transferOwnership()
以启动 。 - 系统会将目标 DPC 设为“活跃管理员”,并设置 指定为受管理设备或工作资料的所有者。
- 目标 DPC 接收回调
onTransferOwnershipComplete()
,可配置 使用bundle
参数的值。 - 如果转让操作出错,系统会将所有权还原到
源 DPC。如果来源设备政策控制器 (DPC) 需要确认所有权转让
成功,请调用
isAdminActive()
以检查源 DPC 不再是活跃管理员。
在工作资料中运行的所有应用都会收到
ACTION_PROFILE_OWNER_CHANGED
广播:
个人资料所有者发生变化。在受管设备上运行的应用会收到
ACTION_DEVICE_OWNER_CHANGED
广播,
设备所有者更改。
完全托管设备中的工作资料
转让两个以设备所有者和资料所有者身份运行的 DPC 实例 分两个阶段完成当个人资料和工作资料 有关联,请按以下顺序完成转移:
- 首先,转移工作资料的所有权。
- 等待
DeviceAdminReceiver
回调onTransferAffiliatedProfileOwnershipComplete()
以确认工作资料已转移到目标设备政策控制器 (DPC)。 - 最后,将受管设备的所有权转让给目标 DPC。
推迟无线下载 (OTA) 更新
设备所有者可以将设备的 OTA 系统更新最多推迟 90 天, 在关键时段(例如 节假日)。在发生任何已定义的事件后,系统会强制规定 60 天缓冲期 冻结期,以防止无限期冻结设备。
在冻结期内:
- 设备不会收到任何有关待完成 OTA 更新的通知。
- 设备不会向操作系统安装任何 OTA 更新。
- 设备用户无法在“设置”中手动检查有无 OTA 更新。
要设置冻结期,请调用
SystemUpdatePolicy.setFreezePeriods()
。因为严寒
周期每年重复一次,该周期的开始日期和结束日期表示
按从年份开始计算的天数的整数值。开始日期必须是
在先前的任何冻结期结束至少 60 天后开始。设备
所有者可以呼叫 SystemUpdatePolicy.getFreezePeriods()
以
获取之前在系统更新政策对象上设置的冻结期列表。
DevicePolicyManager.getSystemUpdatePolicy()
已
更新后,系统会返回设备所有者设置的所有冻结期。
限制共享到工作资料
资料所有者可以禁止用户将个人数据分享到工作资料中
通过添加用户限制
DISALLOW_SHARE_INTO_MANAGED_PROFILE
。
此限制可防止下列 Intent 处理和共享:
- 个人资料应用与工作资料应用分享数据和文件。
- 从个人资料中选择内容的工作资料应用,例如 图片或文件。
设置此限制后,您的 DPC 仍可允许跨资料活动
调用 intent
addCrossProfileIntentFilter()
。
硬件保护密钥和机器证书
Android 9 添加了一些 API 来帮助您使用密钥和证书, 来安全地识别设备在资料所有者或设备中运行的 DPC 所有者模式(即委派证书安装程序)可以 完成以下任务:
- 在安全硬件(例如
执行环境 (TEE) 或安全元件 (SE)。通过
生成的密钥绝不会离开安全硬件,并且可通过 Android
KeyChain。致电
DevicePolicyManager.generateKeyPair()
,用于提供 算法(请参阅KeyPairGenerator
)以及您为 Google API 客户端指定的 例如序列号或 IMEI。为了详细了解 请参阅Android 9 安全性 增强功能。 - 将证书与现有设备生成的密钥相关联。致电
DevicePolicyManager.setKeyPairCertificate()
供应 现有密钥和证书链的别名 - 从叶项开始 并依次添加信任链 - 在使用密钥之前,请确认安全硬件对密钥进行了保护。检查 哪些机制保护密钥,请按照密钥 证明。
- 设备所有者和委派证书安装程序可以收到经过签名的
设备声明硬件 ID 和 Android 系统版本。致电
DevicePolicyManager.generateKeyPair()
,传递一个或多个 /ID_TYPE_BASE_INFO
,ID_TYPE_SERIAL
,ID_TYPE_IMEI
或ID_TYPE_MEID
idAttestationFlags
参数。返回的证书包含硬件 与认证记录中的 ID 相关联。如果您不希望包含硬件 ID,请将0
。资料所有者只能接收制造商信息(通过ID_TYPE_BASE_INFO
)。如需检查设备是否可以证明 ID,请调用isDeviceIdAttestationSupported()
。 - 防止设备用户滥用企业密钥(在非企业任务中)
方法是使密钥证书不可选择系统不包括
选择器面板中不可选择的证书。在
DeviceAdminReceiver.onChoosePrivateKeyAlias()
回调方法,则返回企业密钥的别名,以便系统 由系统代表用户自动选择证书。要创建密钥,请执行以下操作: 不可选择,请调用以下DevicePolicyManager
方法: <ph type="x-smartling-placeholder">- </ph>
setKeyPairCertificate()
和 为isUserSelectable
参数传递false
。installKeyPair (ComponentName, PrivateKey, Certificate[], String, int)
并从中省略INSTALLKEY_SET_USER_SELECTABLE
flags
参数。
通过结合这些 API,企业可以安全地识别设备并确认 在提供访问权限之前确保了其完整性:
- Android 设备在安全硬件中生成新的私钥。 由于私钥永远不会离开安全硬件,因此始终保持机密状态。
- 设备使用该密钥创建和发送证书签名请求 (CSR) 发送到服务器。CSR 包含认证记录,该记录包含 设备 ID。
- 服务器验证证书链(基于 Google 证书的 root 权限) 并从认证记录中提取设备元数据。
- 服务器确认安全硬件保护私钥并 确保设备 ID 与企业记录相符。服务器还可以 确保 Android 系统和补丁版本符合所有要求。
- 服务器根据 CSR 生成证书,并将该证书发送到 。
- 设备将证书与私钥(保留在 安全硬件),使应用能够连接到企业服务。
更多安全 API、功能和变更
安全日志和网络日志的 ID
Android 9 将 ID 包含在安全和网络活动日志中。数字 ID 每个事件单调递增,IT 管理员更容易发现 日志中的数据缺口因为安全日志和网络日志是相互独立的 集合,系统将保留单独的 ID 值。
调用 SecurityEvent.getId()
,
DnsEvent.getId()
或
ConnectEvent.getId()
:用于获取 ID 值。系统
每当 DPC 启用日志记录或设备重启时,都会重置该 ID。
通过调用以下方法来提取安全日志:
DevicePolicyManager.retrievePreRebootSecurityLogs()
不包含这些 ID。
安全日志记录
安全日志记录会为每个 SecurityEvent
分配一个日志级别。要获取日志级别,
调用 getLogLevel()
。此方法会返回一个日志级别值,
可以是以下项之一:LEVEL_INFO
、LEVEL_WARNING
或
LEVEL_ERROR
。
Android 9 会将下表中列出的事件记录到安全性中
日志。如需检查事件的代码,请调用 getTag()
。接收者
检索事件数据,请调用 getData()
。
工作资料锁定屏幕验证
从 Android 9 开始,资料所有者可以要求用户设置单独的锁定方式
使用
DISALLOW_UNIFIED_PASSWORD
用户限制。接收者
检查用户是否为其设备设置了相同的锁屏验证方式,
工作资料, 通话
DevicePolicyManager.isUsingUnifiedPassword()
。
如果设备设有单独的工作资料锁定屏幕,
DevicePolicyManager.setMaximumTimeToLock()
仅设置
为工作资料(而非整个设备)设置锁屏时间。
开发者工具访问权限
为了帮助保留工作资料中的工作数据,Android 调试桥 (adb) 工具 无法访问工作资料中的目录和文件。
支持更多生物识别选项
Android 9 增加了对生物识别硬件身份验证的精细控制,
工作资料的锁定屏幕。调用现有
DevicePolicyManager.setKeyguardDisabledFeatures()
方法(包含 KEYGUARD_DISABLE_FACE
和
KEYGUARD_DISABLE_IRIS
。
如需停用设备提供的所有生物识别身份验证方法,请添加 KEYGUARD_DISABLE_BIOMETRICS
。
弃用设备管理政策
对于使用设备的 DPC,Android 9 将下列政策标记为已弃用 管理员。这些政策将继续有效 。从 Android 10 版本开始 当设备管理员调用相同的政策时,将抛出 SecurityException。
USES_POLICY_DISABLE_CAMERA
USES_POLICY_DISABLE_KEYGUARD_FEATURES
USES_POLICY_EXPIRE_PASSWORD
USES_POLICY_LIMIT_PASSWORD
一些应用利用设备管理员进行用户设备管理。对于 例如锁定和擦除丢失的设备以下政策将继续有效 可用于启用此功能:
如需详细了解这些变化,请参阅设备管理 弃用。
简化了二维码注册流程
内置二维码库
Android 9 捆绑了一个 QR 码库,以简化 QR 码设备 预配。IT 管理员无需再手动输入 Wi-Fi 详细信息即可进行设置 。但 Android 9 可以改为包含这些 Wi-Fi 详细信息 二维码。当 IT 管理员使用公司自有设备扫描二维码时 设备,则设备会自动连接到 Wi-Fi 并进入配置 整个流程,而无需任何其他手动输入。
QR 码配置方法支持以下配置 extra 指定 Wi-Fi 详细信息:
EXTRA_PROVISIONING_WIFI_HIDDEN
EXTRA_PROVISIONING_WIFI_PAC_URL
EXTRA_PROVISIONING_WIFI_PASSWORD
EXTRA_PROVISIONING_WIFI_PROXY_BYPASS
EXTRA_PROVISIONING_WIFI_PROXY_HOST
EXTRA_PROVISIONING_WIFI_PROXY_PORT
EXTRA_PROVISIONING_WIFI_SECURITY_TYPE
EXTRA_PROVISIONING_WIFI_SSID
使用配置 extra 设置日期和时区
QR 码配置方法支持使用配置 extra 来设置时间和 时区:
擦除数据选项
设备管理员可以在移除工作时向用户显示个性化消息
个人资料或次要用户该消息有助于设备用户了解
IT 管理员移除了工作资料或次要用户。致电
wipeData(int, CharSequence)
,并提供一个简短的
说明性消息。当被主要用户或设备所有者调用时,系统会
不显示消息并开始将设备恢复出厂设置。
如需从嵌入式 eUICC SIM 卡中移除订阅数据,请调用
wipeData()
,并在 flags
中包含 WIPE_EUICC
参数。
适用于关联商家资料所有者的方法
以下方法适用于关联的商家资料 所有者:
DevicePolicyManager.setKeyguardDisabled()
DevicePolicyManager.setStatusBarDisabled()
PackageInstaller.createSession()