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 已启动时创建并切换至演示用户,启用覆盖层 (overlay) 资源中指定的自定义启动器,并停用 SUW。系统服务器和 SystemUI 也会使用此标记来管理零售模式的各个方面。
设置自定义启动器或视频播放器
设备制造商可以通过替换 config.xml 文件中指定的框架资源 config_demoModeLauncherComponent
来指定自定义启动器,如下所示。
<!-- 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)中查找视频并进行循环播放。当用户触摸屏幕时,自定义启动器会停用其活动组件,然后默认的系统启动器便会启动。
自定义启动器必须将其自定义组件标记为默认停用,从而避免该组件在非演示情境下出现。在演示情境下,系统服务器会在启动新的演示会话时启用指定的 config_demoModeLauncherComponent
。
设置向导也会查找上述视频作为素材,以提供给演示模式进行播放。如果视频不是演示的一部分,可以修改 SUW 以查找其他表明支持演示模式的 OEM 特定标志。如果有 A/B 两个系统分区,则 B 系统分区的 /preloads/demo 中必须包含演示视频。在首次启动时,系统会将该视频复制到 /data/preloads/demo。
针对零售演示模式自定义预加载的应用
预加载的应用可以调用 UserManager.isDemoUser()
API 来查看应用是否在演示环境中启动,以此针对零售演示模式自定义应用体验。
演示用户中设置了一些限制,类似于通过托管设备/配置文件策略防止应用和用户执行某些操作。其中一项限制是 DISALLOW_MODIFY_ACCOUNTS
。在此限制之下,AccountManager 和设置不允许添加账号。某些 Google 应用会对此限制做出反应并显示一条错误消息,其他应用则不提示登录账号(如 YouTube 和 Google 相册)。我们建议 OEM 应用也应检查是否已设置 DISALLOW_MODIFY_ACCOUNTS
,并相应地处理场景。
系统更新
默认情况下,启用演示模式时,设备政策将自动设置为无线下载 (OTA) 更新。零售设备将不经过用户确认,自动下载、重新启动并安装更新(考虑电池阈值)。
零售演示模式
要实现基于设备所有者的零售演示模式,需要将设备政策控制器应用设置为设备所有者。AOSP 中有可供参考的 RetailDemo 应用实现,详见 /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-rUS/strings.xml 中:
<string name="retail_demo_video_download_url">download URL for UK video goes here</string>
每次设备重新启动时,此视频最多只能下载一次。视频在设备上播放时,RetailDemo 应用会在后台检查是否提供了下载网址以及网址中的视频是否比正在播放的视频新。
如果是,RetailDemo 应用就会下载并开始播放视频。视频下载完毕后,即会提供给所有演示会话播放。在下次重新启动之前,将不再执行任何此类检查。
演示视频指南
演示视频必须采用纵向布局(如果是平板电脑,则应采用设备自然屏幕方向),且时长在 5 秒以上。由于视频将在展示期间持续播放,因此视频内容不能导致烧屏。
请参阅用户、配置文件和账号的 Android 开发者定义、Device Policy Manager API 文档和示例设备所有者应用。
验证
CTS 不涵盖零售演示模式,因为该模式是一项可选功能。测试应手动进行,或对演示应用进行单元测试。
演示会话
演示会话设置
如果从出厂演示模式下配置演示模式,零售演示设备可能会以零售演示模式启动。或者,零售员工可以直接在设置向导中启用演示模式。
图 2.零售演示模式
展示演示会话
设备进入演示模式后,会切换到新的演示用户,并自动启动覆盖层资源中指定的自定义启动器(如实现部分所述)。默认情况下,此自定义启动器会重复播放演示视频,直至用户触摸屏幕开始演示用户会话。这时,自定义启动器会在启动系统启动器后退出。原始设备制造商 (OEM) 可以更改自定义启动器,使其在退出时额外启动其他服务或活动。
为了保持演示模式的完整性,键盘锁会被停用,且某些可能会对演示模式产生不利影响的“快捷设置”操作也会被禁用,其中包括:
- 飞行模式切换。
- 移除或修改 WLAN 接入点(设置)。
- 更改运营商(设置)。
- 配置热点(设置)。
- 用户切换。
此外,还对某些会影响零售模式的全局设置进行了停用,以便阻止对这些设置的访问:
- Wi-Fi 设置。
- 移动网络配置选项,尤其是热点。
- 蓝牙配置。
- 备份和重置、日期和时间以及移动网络(这些选项将不会显示)
如果用户一段时间(默认为 90 秒)没有操作,演示模式会显示系统对话框,提示用户是退出会话还是继续。如果用户选择退出或在 5 秒内没有任何响应,演示模式将移除当前演示用户,然后切换到新的演示用户,并再次循环播放原始视频。如果使用电源按钮关闭屏幕,它会在几秒钟后自动重新打开。
设备退出演示会话后,会自动静音并重置一些全局设置,其中包括:
- 亮度
- 自动屏幕旋转
- 手电筒
- 语言
- 无障碍
退出零售演示模式
如需退出演示模式,零售员工必须确保演示设备未注册设备管理服务,并且通过引导加载程序 (boot loader) 将设备恢复出厂设置。