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.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
。由于此限制,帐户管理器和设置不允许添加帐户。某些 Google 应用程序会对此限制作出反应并显示错误消息,而其他应用程序则不会提示输入帐户(例如 YouTube 和照片)。我们建议 OEM 应用程序还检查DISALLOW_MODIFY_ACCOUNTS
是否已设置并相应地处理该情况。
系统升级
默认情况下,启用零售模式后,设备策略将设置为自动无线 (OTA) 更新。零售设备将下载、重新启动并安装更新(遵守电池阈值),无需用户交互。
零售演示应用程序
基于设备所有者的零售演示模式实施需要将设备策略控制器应用程序设置为设备所有者。 AOSP 在/packages/apps/RetailDemo中包含参考 RetailDemo 应用程序实现。
设备所有者应用程序不需要提升权限或在系统映像上预安装,并且可以在设置或配置过程中下载。它们的实现方式大多与传统应用程序类似,但存在以下差异:
所有设备所有者应用程序都必须扩展DeviceAdminReceiver组件,该组件充当所有DevicePolicyManager API 的授权令牌。该组件必须持有
android.permission.BIND_DEVICE_ADMIN
权限,包含请求的特殊策略作为元数据,并过滤android.app.action.PROFILE_PROVISIONING_COMPLETE
和android.app.action.DEVICE_ADMIN_ENABLED
意图。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。
<!-- URL where the retail demo video can be downloaded from. -->
<string name="retail_demo_video_download_url"></string>
如果需要在不同地区使用不同的视频,则可以使用res/values-*/strings.xml中特定区域的字符串资源来配置不同的下载 URL。例如,如果需要在美国和英国使用不同的视频,则可以将相应的下载网址放在 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 应用程序会在后台检查是否提供了下载 URL,以及该 URL 上的视频是否比正在播放的视频新。
如果是这样,RetailDemo 应用程序将下载并开始播放视频。下载视频后,它将用于在以后的所有演示会话中播放。在下次重新启动之前,不会再进行任何检查。
演示视频指南
演示视频必须采用纵向布局,或者如果是平板电脑,则必须采用设备的自然方向,并且长度可以超过五秒。内容不得导致烧屏,因为它在显示时会不断播放。
有关详细信息,请参阅用户、配置文件和帐户的Android 开发人员定义、设备策略管理器 API 文档和示例设备所有者应用。
验证
CTS 不涵盖零售演示模式,因为它是可选功能。测试必须手动进行或通过演示应用程序的单元测试进行。
演示会议
演示会话的设置
如果出厂时配置为演示模式,零售演示设备可能会启动进入零售演示模式。或者,零售员工可以直接从设置向导启用零售模式。
图2零售示范模式
显示演示会话
当设备进入零售模式时,它会切换到新的演示用户,并自动启动覆盖资源中指定的自定义启动器,如实现中所述。默认情况下,此自定义启动器会重复播放演示视频,直到用户触摸屏幕开始演示用户会话。此时,自定义启动器启动系统启动器,然后退出。 OEM 可以更改自定义启动器,以便在退出时另外启动其他服务或活动。
为了保持零售模式的完整性,键盘保护被禁用,并且也不允许快速设置中可能对零售模式产生不利影响的某些操作,包括以下操作。
- 飞行模式切换。
- 删除或修改 Wi-Fi 接入点(设置)。
- 更改运营商(设置)。
- 配置热点(设置)。
- 用户切换。
此外,还可以通过禁用以下功能来阻止对某些可能影响零售模式的全局设置的访问:
- 无线网络设置。
- 蜂窝网络配置选项,特别是热点。
- 蓝牙配置。
- 备份和重置、日期和时间以及移动网络(它们根本不显示)。
如果用户空闲一段时间(默认为 90 秒),零售模式会显示一个系统对话框,提示用户退出会话或继续。如果用户选择退出或五秒钟内没有响应,零售模式将删除当前的演示用户,切换到新的演示用户,并再次循环播放原始视频。如果使用电源按钮关闭屏幕,屏幕会在几秒钟后自动重新打开。
退出演示会话后,设备会自行静音并重置一些全局设置,包括以下设置:
- 亮度
- 自动旋转
- 手电筒
- 语言
- 无障碍
退出零售演示模式
为了退出零售模式,零售员工必须确保演示设备未在设备管理下注册,并从引导加载程序将设备恢复出厂设置。