{"slug": "razrabotka-android-kiosk-prilozheniia", "title": "Разработка Android Kiosk приложения", "summary": "This article, written by Android developer Davran, provides a technical overview of developing a Kiosk application for Android. It explains that a Kiosk app locks a user into a single application, commonly used in terminals and self-service devices, and details the implementation using the Device Policy Manager API and Lock Task Mode. The author describes the process of setting a whitelist of allowed packages and configuring lock task features to disable the system UI, while noting the challenge of having to re-enable features individually when exiting Kiosk mode.", "body_md": "Всем привет это моя первая публикация. И первый опыт написания статей по разработке.\n\nДавайте начнем с небольшого знакомства.\n\nМеня зовут Давран, я андройд разработчик с 8 летнем стажем разработки мобильных приложений разного спектра.\n\nМой опыт работы:\n\nСегодня я хотел начать свое повествование с темы Android Kiosk.\n\nНа первый взгляд kiosk приложение на Android - это что то простое: нужно просто \"залочить\" пользователя внутри одного экрана.\n\nНа практике все оказалось немного сложнее.\n\nВ рамках нашего проекта Pai, я занимался разработкой приложения под планшет, а так же написанием лаунчера(как в итоге оказалось не совсем лаунчером)\n\n**Что такое киоск **\n\nKiosk-приложение - *это приложение с ограниченным доступом в котором пользователь не может выйти за пределы одного приложения.*\n\nТакие решения используется в терминалах, POS системах инфокиосках и устройствах самообслуживания.\n\n**Требования**\n\nНа старте требования казались простыми, у меня был небольшой опыт написания лаунчера под android, и я думал что этих знаний и каких нибудь pet проектов на гитхабе хватит для решения задачи.\n\nНо у меня было много вопросов которые направили меня на поиск документации для этой области([ссылка](https://developer.android.com/work/dpc/dedicated-devices?hl=ru))\n\nИтого нам нужно чтобы:\n\n- Пользователь не смог выйти из приложения\n- Приложение должно запускаться автоматически при включении устройства\n- Нельзя давать доступ к системным настройкам и UI\n\n**Реализация**\n\nВсе что мне потребовалось это немного документации,\n\nпару снипетов кода.\n\nЗа основу решения были взяты Device Owner и Lock Task Mode.\n\nНу что же, теперь перейдем непосредственно к коду и реализации...\n\n**Kiosk Controller**\n\nПервым делом нам предстоит ознакомиться с [DevicePolicyManager API](https://developer.android.com/reference/android/app/admin/DevicePolicyManager)\n\nесли в двух словах то это API для администратора устройства которое позволяет нам много вещей(управление приложениями, управление настройками девайса и прочие вещи)\n\nно для этого нам нужно одно из двух, либо нужные пермишины либо же админ права(это не есть рут устройства)\n\nДальше нам предстоит ознакомиться с [KeyguardManager API](https://developer.android.com/reference/android/app/KeyguardManager)\n\nэто API нужно нам для работы с лок скрином девайса а точнее для прослушивание его стейтов.\n\nИ так же нам нужно создать [DeviceAdminReceiver](https://developer.android.com/reference/android/app/admin/DeviceAdminReceiver) для получения установленных настроек в наше приложение\n\n1 - Нам нужно создать white list приложений которые можно будет запускать в режиме киоска поэтому мы создадим массив названия пакетов:\n\n```\nprivate val WHITE_LIST_PACKAGES = arrayOf(\n    \"your.package.name\",\n    \"dev.firebase.appdistribution\",\n    \"com.android.settings\"\n)\n```\n\n2 - Мы создаем класс KioskController и создаем ссылки на системные сервисы\n\n```\n private val dpm = context.getSystemService(DevicePolicyManager::class.java)\n    private val keyguard = context.getSystemService(KeyguardManager::class.java)\n    private val admin = ComponentName(context, AdminReceiver::class.java)\n```\n\n3 - Основную работу будет делать нам DevicePolicyManager\n\nи первая магическая строчка это\n\n```\ndpm.setLockTaskPackages(admin, arrayOf(WHITE_LIST_PACKAGES))\n```\n\nданная команда отдает системе белый список приложений которые можно будет открыть в режиме киоска\n\nвторая магичечская строчка\n\n```\ndpm.setLockTaskFeatures(\nadmin,\nDevicePolicyManager.LOCK_TASK_FEATURE_NONE\n)\n```\n\nданная команда отключает все настраиваемые элементы с UI в режиме киоска(статус бар,навигационный бар, одним словом у вас в киоск режиме отключается весь внешний UI системы)\n\nиз минусов я нашел только вновь кривой API, так как флаг\n\nDevicePolicyManager.LOCK_TASK_FEATURE_NONE выключает все\n\nно нет флажка включить все, поэтому придется использовать комбинацию флажков чтобы вернуться с режима киоска\n\n```\ndpm.setLockTaskFeatures(\n            admin,\n            DevicePolicyManager.LOCK_TASK_FEATURE_HOME or\n                DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW or\n                DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS or\n                DevicePolicyManager.LOCK_TASK_FEATURE_GLOBAL_ACTIONS\n        )\n```\n\nи на выходе у нас получаются две функции\n\n```\n fun enterAdminMode() {\n        if (!isDeviceOwner()) return\n        dpm.setLockTaskFeatures(\n            admin,\n            DevicePolicyManager.LOCK_TASK_FEATURE_HOME or\n                DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW or\n                DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS or\n                DevicePolicyManager.LOCK_TASK_FEATURE_GLOBAL_ACTIONS\n        )\n    }\nfun exitAdminMode() {\n        if (!isDeviceOwner()) return\n\n        dpm.setLockTaskFeatures(admin, DevicePolicyManager.LOCK_TASK_FEATURE_NONE)\n    }\n```\n\nесть еще вспомогательные\n\n```\nfun canStartLockTask(): Boolean {\n        if (!isDeviceOwner()) return false\n        if (!dpm.isLockTaskPermitted(context.packageName)) return false\n        return !keyguard.isDeviceLocked\n    }\n```\n\nisLockTaskPermitted - это проверка на на наличие прав у приложение переходить в режим киоска.\n\n```\nfun isDeviceOwner(): Boolean = dpm.isDeviceOwnerApp(context.packageName)\n```\n\nПроверка на наличие прав админа устройства\n\nТак же у DevicePolicyManager есть функция addRestriction\n\nкоторая позволяет выключить ту или иную вещь на девайсе:\n\n- Сейф бут\n- сброс заводских настроек\n- подключение внешних юсб\n- добавление аккаунтов на устройство\n- настройки блютуза и еще много чего.\n\nпеременная admin - это [DeviceAdminReceiver](https://developer.android.com/reference/android/app/admin/DeviceAdminReceiver)\n\nкоторый помогает системе определить куда вести все эти настройки в действие.\n\n**Установка приложения **\n\nНа этом создание контролера завершено, далее нам нужно сбросить девайс до заводских настроек, включить USB debugging, разрешить установку через USB и не создавать и не авторизовываться ни под каким аккаунтом на устройстве.\n\nМы ставим наше приложение на устройство, открываем терминал и выполняем команду\n\nУстановка девайс овнера\n\n```\nadb shell dpm set-device-owner \"your.package.name/com.example.AdminReceiver\n```\n\nУдаление девайс овнера\n\n```\nadb shell dpm remove-active-admin \"your.package.name/com.example.AdminReceiver\n```\n\nи указываем путь до нашего AdminReceiver(это DeviceAdminReceiver который мы создали в KioskController)\n\n```\nclass AdminReceiver : DeviceAdminReceiver()\n```\n\nНа этом нам осталось лишь установить наше приложение как домашний лаунчер устройства и поздравляю вас, вы теперь админ устройства в режиме киоска.\n\nP.S - я использовал SingleActivity архитектуру для того чтобы добавить скрытую кнопку которая позволит открыть AdminScreen\n\nввести пин код админа и выйти с режима киоска для конфигурации планшета.\n\nЕсли хотите могу эту часть тоже описать.", "url": "https://wpnews.pro/news/razrabotka-android-kiosk-prilozheniia", "canonical_source": "https://dev.to/davran0110/razrabotka-android-kiosk-prilozhieniia-2o80", "published_at": "2026-05-23 18:16:42+00:00", "updated_at": "2026-05-23 18:33:04.355431+00:00", "lang": "en", "topics": ["developer-tools"], "entities": ["Android", "DevicePolicyManager", "Lock Task Mode", "Device Owner", "Pai"], "alternates": {"html": "https://wpnews.pro/news/razrabotka-android-kiosk-prilozheniia", "markdown": "https://wpnews.pro/news/razrabotka-android-kiosk-prilozheniia.md", "text": "https://wpnews.pro/news/razrabotka-android-kiosk-prilozheniia.txt", "jsonld": "https://wpnews.pro/news/razrabotka-android-kiosk-prilozheniia.jsonld"}}