Android 7.1.1 引入了对零售演示模式的系统级支持,以便客户可以在零售店查看设备的实际运行情况。设备设置为零售演示模式,方法是使用设备所有者应用来确保设备使用仅限于某些演示模式应用。最终用户不得在零售演示设备上添加个人帐号。Android 8.1 修订了此支持,以通过 DevicePolicyManager createAndManageUser API 创建演示用户。这样,OEM 可以在用户管理和演示设备上的设备政策管理方面对标准零售模式进行更大的自定义。
虽然 DevicePolicyManager API 可在 Android 8.1 之前的版本上使用,但在 8.0 及更早版本中,无法通过 createAndManageUser API 创建演示类型用户 (DevicePolicyManager.MAKE_USER_DEMO
)。
Android 8.1 及更高版本中的实现
本部分重点介绍平台增强功能,并介绍 Android 8.1 及更高版本中的零售演示应用。
平台变更
设置 DEVICE_DEMO_MODE
实现基于设备所有者的零售演示模式的设备必须在预配之前将 Settings.Global.DEVICE_DEMO_MODE
设置为 1,以表明设备正在预配为零售演示模式。SystemServer 使用此标志来管理零售模式的各个方面,例如电源配置文件和 SystemUI。
启用 RetailDemoModeService
在实施零售演示模式的设备中,设置向导会将全局设置 Global.DEVICE_DEMO_MODE
设置为 true
,以表明设备已进入零售模式。在看到此设置后,RetailDemoModeService 会创建一个演示用户,并在用户 0 启动时切换到该用户,启用叠加资源中指定的自定义启动器,并禁用 SUW。System Server 和 SystemUI 也使用此标志来管理零售模式的各个方面。
设置自定义启动器或视频播放器
设备制造商可以通过覆盖框架资源 config_demoModeLauncherComponent
来指定自定义启动器,该资源在 config.xml 文件中指定,如下所示。
<!-- Component that is the default launcher when Retail Mode is enabled. -->
<string name="config_demoModeLauncherComponent">com.android.retaildemo/.DemoPlayer</string>
位于 /packages/apps/RetailDemo 的零售演示 DemoPlayer 应用是 Android 开源项目 (AOSP) 中的默认自定义启动器。该应用会在设备分区(例如 /data/preloads/demo/retail_demo.mp4)中查找视频并循环播放。当用户触摸屏幕时,自定义启动器会停用其 activity 组件,从而导致默认系统启动器启动。
自定义启动器必须将其自定义组件标记为默认停用,这样它才不会在非演示场景中显示。在演示场景中,当启动新的演示会话时,System Server 会启用指定的 config_demoModeLauncherComponent
。
设置向导还会查找前面提到的视频,以提供进入零售模式的功能。如果视频不是演示的一部分,则可以修改 SUW 以查找某些其他 OEM 特定的零售模式支持标志。如果存在系统 A/B 分区,则系统 B 分区必须在 /preloads/demo 中包含演示视频。这会在首次启动时复制到 /data/preloads/demo。
自定义零售演示模式的预加载应用
预加载的应用可以通过调用 UserManager.isDemoUser()
API 来查看应用是否在演示环境中启动,从而自定义其零售演示模式体验。
演示用户中设置了某些限制,类似于托管设备或个人资料政策,这些限制会阻止应用和用户执行某些操作。其中一项限制是 DISALLOW_MODIFY_ACCOUNTS
。有了此限制,AccountManager 和 Settings 不允许添加帐号。某些 Google 应用会对此限制做出反应并显示错误消息,而其他应用则不会提示输入帐号(例如 YouTube 和 Google 相册)。我们建议 OEM 应用也检查是否设置了 DISALLOW_MODIFY_ACCOUNTS
,并相应地处理这种情况。
系统更新
默认情况下,启用零售模式后,设备政策会设置为自动进行无线 (OTA) 更新。零售设备将自动下载、重启和安装更新(遵守电池电量阈值),而无需用户交互。
零售演示应用
基于设备所有者的零售演示模式实现需要将 设备政策控制器 应用设置为设备所有者。AOSP 在 /packages/apps/RetailDemo 中包含零售演示应用参考实现。
设备所有者应用不需要提升的权限或在系统映像上预安装,可以在设置或配置过程中下载。它们主要像传统应用一样实现,但有以下区别
所有设备所有者应用都必须扩展 DeviceAdminReceiver 组件,该组件充当所有 DevicePolicyManager API 的授权令牌。该组件必须持有
android.permission.BIND_DEVICE_ADMIN
权限,将请求的特殊政策作为元数据包含在内,并过滤android.app.action.PROFILE_PROVISIONING_COMPLETE
和android.app.action.DEVICE_ADMIN_ENABLED
intent。设置为创建特殊演示类型用户的 DevicePolicyManager#MAKE_USER_DEMO 标志是一个隐藏的 API。此标志的值为常量 0x4。
设备所有权必须仅通过设备管理角色持有者或 ManagedProvisioning 应用分配。
DevicePolicyManager 类中的 API 使设备所有者 (DO) 和个人资料所有者 (PO) 能够实施各种设备政策。以下列出了适用于零售演示模式的某些 DevicePolicyManager 功能。
创建和管理用户。
重启设备。
设置 LockTask 允许的软件包。
通过 PackageInstaller 安装软件包。
阻止卸载软件包。
启用自动系统更新。设备将自动下载并应用 OTA 更新。
停用锁屏界面。
阻止设置密码或指纹。
设置 Settings.Global、Settings.Secure 和 Settings.System 设置的允许列表集。
将权限政策设置为
PERMISSION_POLICY_AUTO_GRANT
,这将自动授予所有运行时权限。权限也可以更狭义地授予:向单个应用授予单个权限。这不适用于应用操作权限,用户仍必须按用户、按应用授予这些权限。按照 UserManager 中的定义,设置与零售模式相关的用户限制,如下所示。
DISALLOW_MODIFY_ACCOUNTS
DISALLOW_USB_FILE_TRANSFER
DISALLOW_DEBUGGING_FEATURES
DISALLOW_CONFIG_WIFI
DISALLOW_CONFIG_BLUETOOTH
DISALLOW_INSTALL_UNKNOWN_SOURCES
DISALLOW_CONFIG_MOBILE_NETWORKS
使用网络更新演示视频
/packages/apps/RetailDemo 中的 RetailDemo 应用能够在有网络连接的情况下更新演示视频。可以通过覆盖 RetailDemo 应用中的以下字符串值来配置从中下载视频的网址。
<!-- URL where the retail demo video can be downloaded from. -->
<string name="retail_demo_video_download_url"></string>
如果需要在不同地区使用不同的视频,则可以通过在 res/values-*/strings.xml 中使用特定于语言区域的字符串资源来配置不同的下载网址。例如,如果需要在美国和英国使用不同的视频,则可以将相应的下载网址分别放在 res/values-en-rUS/strings.xml 和 res/values-en-rGB/strings.xml 中,如下所示。
在 res/values-en-rUS/strings.xml 中
<string name="retail_demo_video_download_url">download URL for US video goes here</string>
在 res/values-en-rGB/strings.xml 中
<string name="retail_demo_video_download_url">download URL for UK video goes here</string>
每个设备重启后,此视频最多下载一次。当设备上的视频正在播放时,RetailDemo 应用会在后台检查是否提供了下载网址,以及该网址上的视频是否比正在播放的视频更新。
如果是,则 RetailDemo 应用会下载并开始播放该视频。视频下载后,它将用于在所有后续演示会话中播放。在下次重启之前,不会再次进行任何检查。
演示视频指南
演示视频必须采用纵向布局,或者如果是平板电脑,则采用设备的自然方向,并且长度可以大于五秒。内容不得导致老化,因为它会在显示时持续播放。
有关更多信息,请参阅用户、个人资料和帐号的Android 开发者定义、Device Policy Manager API 文档和示例设备所有者应用。
验证
CTS 不涵盖零售演示模式,因为它是一项可选功能。测试必须手动进行或使用演示应用的单元测试进行。
演示会话
演示会话的设置
零售演示设备可能会启动进入零售演示模式(如果在出厂时配置为演示模式)。或者,零售员工可以直接从设置向导启用零售模式。
图 2. 零售演示模式
显示演示会话
当设备进入零售模式时,它会切换到新的演示用户,并自动启动叠加资源中指定的自定义启动器,如实施中所述。默认情况下,此自定义启动器会重复播放演示视频,直到用户触摸屏幕以开始演示用户会话。届时,自定义启动器将启动系统启动器,然后退出。OEM 可以更改自定义启动器,以便在退出时额外启动另一个服务或 Activity。
为了维护零售模式的完整性,锁屏界面被停用,并且还禁止从快捷设置中执行某些可能对零售模式产生不利影响的操作,包括以下操作。
- 飞行模式切换。
- 移除或修改 Wi-Fi 接入点(“设置”)。
- 更改运营商(“设置”)。
- 配置热点(“设置”)。
- 用户切换。
此外,还阻止访问某些可能影响零售模式的全局设置,方法是停用以下设置
- Wi-Fi 设置。
- 移动网络配置选项,尤其是热点。
- 蓝牙配置。
- 备份和重置、日期和时间以及移动网络(它们根本不显示)。
如果用户闲置一段时间(默认为 90 秒),零售模式会显示一个系统对话框,提示用户退出会话还是继续。如果用户选择退出,或者在五秒钟内没有响应,则零售模式会移除当前的演示用户,切换到新的演示用户,并再次循环播放原始视频。如果使用电源按钮关闭屏幕,它会在几秒钟后自动重新亮起。
退出演示会话后,设备会静音自身并重置某些全局设置,包括以下设置
- 亮度
- 自动旋转
- 手电筒
- 语言
- 无障碍功能
退出零售演示模式
为了退出零售模式,零售员工必须确保演示设备未在设备管理下注册,并从启动加载程序中恢复出厂设置设备。