В Android 7.1.1 появилась поддержка деморежима для магазина на уровне системы. Благодаря этому покупатели могут посмотреть, как работают устройства, прямо в магазине. Устройства настраиваются для демонстрации в розничной торговле с помощью приложения владельца устройства, чтобы ограничить использование устройства только определенными приложениями в демонстрационном режиме. Конечные пользователи не должны иметь возможности добавлять личный аккаунт на демонстрационное устройство. В Android 8.1 поддержка была пересмотрена, и теперь демоаккаунты можно создавать с помощью API DevicePolicyManager createAndManageUser. Это позволяет производителям устройств значительно расширить возможности стандартного розничного режима в отношении управления пользователями и правилами устройств на демонстрационном устройстве.
Хотя API DevicePolicyManager можно использовать в версиях до Android 8.1, пользователи деморежима (DevicePolicyManager.MAKE_USER_DEMO) не могут быть созданы с помощью API createAndManageUser в версиях 8.0 и более ранних.
Реализация в 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. Системные серверы и интерфейс также используют этот флаг для управления аспектами деморежима.
Как задать собственный лаунчер или видеопроигрыватель
Производители устройств могут указать собственный лаунчер, переопределив ресурс фреймворка config_demoModeLauncherComponent, указанный в файле config.xml, следующим образом:
<!-- Component that is the default launcher when Retail Mode is enabled. -->
<string name="config_demoModeLauncherComponent">com.android.retaildemo/.DemoPlayer</string>
Демонстрационное приложение DemoPlayer, расположенное в каталоге /packages/apps/RetailDemo, является стандартным пользовательским лаунчером в Android Open Source Project (AOSP). Приложение ищет видео в разделе устройства, например /data/preloads/demo/retail_demo.mp4, и воспроизводит его по кругу. Когда пользователь касается экрана, специальная панель запуска отключает компонент активности, и запускается системная панель запуска по умолчанию.
Специальный компонент специального средства запуска должен быть по умолчанию отключен, чтобы он не показывался в недемонстрационных сценариях. В демонстрационном сценарии System Server включает указанный параметр config_demoModeLauncherComponent при запуске нового сеанса.
Мастер настройки также ищет упомянутое выше видео, чтобы предложить вам включить режим розничной торговли. Если видео не является частью демонстрации, мастер настройки можно изменить так, чтобы он искал другой признак поддержки демонстрационного режима, характерный для OEM. Если в системе есть разделы A/B, то раздел B должен содержать демонстрационное видео в папке /preloads/demo. При первой загрузке он копируется в /data/preloads/demo.
Как настроить предустановленные приложения для деморежима в магазине
Предустановленные приложения могут настраивать деморежим для магазина, вызывая API UserManager.isDemoUser(), чтобы узнать, запущено ли приложение в деморежиме.
В демоаккаунте установлены определенные ограничения, аналогичные правилам для управляемых устройств или профилей, которые запрещают приложениям и пользователям выполнять определенные операции.
Одно из этих ограничений – DISALLOW_MODIFY_ACCOUNTS. Если это ограничение включено, добавлять аккаунты в AccountManager и настройках нельзя. Некоторые приложения Google реагируют на это ограничение и показывают сообщение об ошибке, а другие не запрашивают аккаунт (например, YouTube и Фото). Рекомендуем также проверять, задано ли значение DISALLOW_MODIFY_ACCOUNTS, и обрабатывать его соответствующим образом.
Обновление системы
По умолчанию, когда включен демонстрационный режим, для устройства автоматически задаются правила для устройств, предусматривающие беспроводное обновление. Устройства, предназначенные для розничной торговли, скачивают, перезагружают и устанавливают обновление (с учетом пороговых значений заряда батареи) без участия пользователя.
Демонстрационное приложение для магазина
Для реализации деморежима на основе владельца устройства необходимо, чтобы приложение Device Policy Controller было задано в качестве владельца устройства. В AOSP есть справочная реализация приложения RetailDemo в каталоге /packages/apps/RetailDemo.
Приложениям владельца устройства не нужны расширенные права или предустановка в образе системы. Их можно скачать во время настройки или инициализации. Они в основном реализованы как обычные приложения, но имеют следующие отличия:
Все приложения, принадлежащие владельцу устройства, должны расширять компонент DeviceAdminReceiver, который служит токеном авторизации для всех API DevicePolicyManager. Компонент должен иметь разрешение
android.permission.BIND_DEVICE_ADMIN, включать запрашиваемые специальные правила в качестве метаданных и фильтровать намеренияandroid.app.action.PROFILE_PROVISIONING_COMPLETEиandroid.app.action.DEVICE_ADMIN_ENABLED.Флаг DevicePolicyManager#MAKE_USER_DEMO, который задается для создания специальных пользователей демоверсии, является скрытым API. Значение этого флага – константа 0x4.
Право собственности на устройство должно назначаться только через держателя роли управления устройством или приложение ManagedProvisioning.
API в классе DevicePolicyManager позволяют владельцу устройства и владельцу профиля применять различные правила для устройств. Ниже перечислены некоторые функции DevicePolicyManager, которые можно использовать в деморежиме для магазина.
Создавать пользователей и управлять ими.
Перезагрузите устройство.
Установите разрешенные пакеты LockTask.
Устанавливайте пакеты с помощью PackageInstaller.
Запретить удаление пакетов.
Включите автоматическое обновление системы. Устройства будут автоматически скачивать и устанавливать беспроводные обновления.
Отключите блокировку клавиатуры.
Запретить установку паролей или отпечатков пальцев.
Задайте белый список настроек Settings.Global, Settings.Secure и Settings.System.
Задайте для правила разрешений значение
PERMISSION_POLICY_AUTO_GRANT, чтобы автоматически предоставлять все динамические разрешения. Разрешения также можно предоставлять более узко: одно разрешение одному приложению. Это не относится к разрешениям app-ops, которые пользователи должны предоставлять для каждого пользователя и приложения отдельно.Задайте ограничения для пользователей, относящиеся к режиму розничной торговли, как определено в UserManager, следующим образом:
DISALLOW_MODIFY_ACCOUNTSDISALLOW_USB_FILE_TRANSFERDISALLOW_DEBUGGING_FEATURESDISALLOW_CONFIG_WIFIDISALLOW_CONFIG_BLUETOOTHDISALLOW_INSTALL_UNKNOWN_SOURCESDISALLOW_CONFIG_MOBILE_NETWORKS
Как изменить демонстрационное видео на сайте
Приложение RetailDemo в /packages/apps/RetailDemo может обновлять демовидео при наличии подключения к сети. URL, по которому можно скачать видео, можно настроить, переопределив следующее строковое значение в приложении RetailDemo.
<!-- URL where the retail demo video can be downloaded from. -->
<string name="retail_demo_video_download_url"></string>
Если в разных регионах нужно использовать разные видео, настройте разные URL для скачивания, используя строковые ресурсы для разных языков в файле 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, документации по Device Policy Manager API и примере приложения для владельца устройства.
Проверка
CTS не охватывает демонстрационный режим, поскольку это необязательная функция. Тестирование должно проводиться вручную или с помощью модульных тестов для демонстрационного приложения.
Демонстрация
Настройка демонстрационного сеанса
Устройства, предназначенные для демонстрации в магазинах, могут загружаться в деморежиме, если он был настроен на них на заводе. Сотрудники розничных магазинов могут включить демонстрационный режим прямо в мастере настройки.

Рисунок 2. Деморежим для магазина
Показать демоверсию
При переходе в демонстрационный режим устройство переключается на нового демопользователя и автоматически запускает пользовательский лаунчер, указанный в ресурсе оверлея, как описано в разделе Реализация. По умолчанию в этом режиме демонстрационный ролик воспроизводится до тех пор, пока пользователь не коснется экрана, чтобы начать сеанс. В это время пользовательский лаунчер запускает системный лаунчер, а затем завершает работу. Производители могут изменить пользовательский лаунчер, чтобы при выходе запускался другой сервис или действие.
Чтобы обеспечить целостность деморежима, блокировка экрана отключена, а некоторые действия в быстрых настройках, которые могут негативно повлиять на деморежим, запрещены. К ним относятся:
- Переключатель режима полета.
- Удаление или изменение точек доступа Wi-Fi (настройки).
- Изменение оператора (настройки).
- Настройка точки доступа (в настройках).
- Переключение пользователей.
Кроме того, доступ к некоторым глобальным настройкам, которые могут повлиять на режим розничной торговли, также блокируется путем отключения следующих функций:
- Настройки Wi-Fi.
- Параметры конфигурации мобильной сети, особенно точки доступа.
- Настройка Bluetooth.
- Резервное копирование и сброс, Дата и время и Мобильные сети (эти пункты не отображаются).
Если пользователь не совершает никаких действий в течение определенного времени (по умолчанию 90 секунд), в розничном режиме появляется системное диалоговое окно с предложением выйти из сеанса или продолжить работу. Если пользователь выберет выход или не ответит в течение пяти секунд, режим для розничной торговли удалит текущего демопользователя, переключится на нового и снова запустит видео. Если экран выключен кнопкой питания, он автоматически включится через несколько секунд.
После выхода из демонстрационного сеанса устройства отключают звук и сбрасывают некоторые глобальные настройки, в том числе следующие:
- Яркость
- Автоповорот
- Фонарик
- Язык
- Специальные возможности
Как выйти из деморежима для магазина
Чтобы выйти из розничного режима, сотрудники магазина должны убедиться, что демонстрационное устройство не зарегистрировано в системе управления устройствами, и сбросить настройки устройства до заводских через загрузчик операционной системы.