Android Kiosk Mode: ограничения по правилам и без

IT-копирайтер
Время чтения: 9 минут
Киоски окружают нас повсюду. Конечно, сегодня речь не пойдет о ларьках, в которых можно купить мороженое или лимонад — мы поговорим о мобильных информационных киосках.
Обычный информационный киоск представляет собой терминал с установленным программным обеспечением, с которым пользователь может совершать ограниченный набор действий. Самые распространенные примеры: банкоматы, фотокабинки, автоматы по продаже билетов, автоматы для выдачи талончиков в очередь и другие.
Киоски могут использовать различные технологии: сенсорный экран, купюроприемник, фото и видеокамеры, принтеры и сканеры, Wi-Fi, NFC и т.д. Их общая черта — защита системы от несанкционированной активности. ПО на таких терминалах пресекает любые попытки пользователя изменить настройки системы, выполнить сброс или установить другие приложения.
Мобильные киоски
Бурное развитие мобильных технологий привело к тому, что смартфоны и планшеты также стали использовать в качестве информационных киосков. Мобильные киоски имеют ряд существенных преимуществ перед стандартными терминалами: они дешевле за счет компактных размеров и массового производства, а также обладают более широким функционалом.
Мобильные киоски используются, например, в качестве электронных меню в ресторанах, справочников для продавцов-консультантов, для демонстрации модельного ряда в магазинах одежды или автосалонах. При этом использование девайса в нерабочих целях исключено.
Чтобы устройство заработало в режиме киоска, на нем запускается программа, которая блокирует функционал ОС и не дает пользователю выйти из приложения.
Приложения-киоски могут иметь засекреченную административную панель или конфигурироваться с сервера удаленно. Также можно настроить систему отчетов: приложение будет отправлять на сервер статистику о поведении пользователя и информировать администратора о своем состоянии.
Команда Azoft занималась созданием приложений, работающих как kiosk mode для Android-устройств. В этой статье мы обсудим подводные камни разработки приложений-киосков и способы решения возникающих проблем.
Режим киоска в Android
Чтобы превратить Android-устройство в киоск, для начала необходимо заблокировать все его кнопки и разъемы. В этом случае самым банальным и при этом самым эффективным решением будет поместить девайс антивандальный ящик, что, конечно, далеко не всегда возможно. Кроме того, остаются статус бар, системные диалоги и виртуальная клавиатура, с помощью которых можно выйти в настройки. Как же обойти эти трудности?
Android 5.0: долгожданный API
Начнем с хороших новостей: в Android 5.0 появился API под названием Screen pinning. Pin в переводе с английского означает закрепить или пригвоздить. Новый API “закрепляет” экран и запрещает пользователю покидать выбранное приложение. Этот функционал можно использовать как при создании киосков для обслуживающего персонала, так и в разработке учебных приложений для проведения экзаменов и оценки знаний.
При активации режима Screen pinning пользователь не прерывается системными диалогами и уведомлениями, не имеет доступа к другим приложениям, не может выйти в главный экран и не видит статус бар.
Активировать режим можно в настройках или программными средствами:
- Разрешите Screen pinning в настройках, а затем выберите нужное приложение и закрепите его, подтвердив свой выбор.
- Для программной активации достаточно вызвать метод startLockTask() и подтвердить включение режима блокировки.
Android до 5.0: как обойти систему?
В более ранних версиях Android SDK режим киоска, к сожалению, не предусмотрен. Нет и целостного API для организации полной блокировки. Поэтому все компоненты блокируются отдельно и по-разному в разных версиях.
Кастомизация прошивки может существенно упростить реализацию kiosk mode, но мы предлагаем несколько техник, которые помогут заблокировать нежелательные элементы в версиях Android ниже 5.0, не требуя ни особой прошивки, ни root-прав.
Перезагрузка
Первое, что приходит на ум пользователю при зависании или появлении других проблем — перезагрузить устройство. Наша задача — сделать так, чтобы после перезагрузки приложение-киоск стартовало автоматически.
Это несложно: описываем ресивер в манифесте, даем разрешение на получение сообщения о перезагрузке устройства и создаем подкласс broadcast ресивера, который будет запускать наше приложение.
AndroidManifest.xml:
<receiver android:name=".BootReceiver"> <intent-filter > <action android:name= "android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
BootReceiver.java :
public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent myIntent = new Intent(context, MyKioskModeActivity.class); myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(myIntent); } }
Кнопка BACK
Для кнопки Back просто переопределяем метод.
@Override public void onBackPressed() { // здесь ничего не делаем }
Кнопка HOME
Кнопку HOME невозможно перехватить, поэтому, чтобы предотвратить переход на главный экран при её нажатии, мы указываем приложение-киоск как Launcher. Добавляем в манифест три строчки:
AndroidManifest.xml:
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
Теперь при нажатии на кнопку HOME будет предлагаться выбор между двумя лаунчерами: нашим и системным. Выбираем наше приложение в качестве лаунчера по умолчанию — и готово!
Кнопка POWER
Кнопка POWER вызывает больше всего вопросов. Один из хаков, позволяющих обработать ее нажатие — задать окно приложения-киоска в качестве экрана блокировки. Однако этот способ гарантированно сработает только на версиях Android ниже 4.0.
@Override public void onAttachedToWindow() { getWindow().addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); getWindow().addFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); }
Системные диалоги
Длинное нажатие кнопки HOME или POWER вызывает системный диалог, с помощью которого можно выйти из приложения. Кроме того существуют еще окна обновления ОС и низкого заряда батареи, которые тоже опасны для киоска, поскольку могут иметь доступ к системным настройкам.
Чтобы полностью избавиться от системных диалогов мы прописываем следующее: при потере фокуса Activity посылает Broadcast — закрыть все системные диалоги.
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(!hasFocus) { Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); } }
Клавиатура
На виртуальной клавиатуре может оказаться кнопка настроек. Если клавиатура необходима, лучшим решением будет создание кастомного варианта или интеграция одной из существующих с ограниченным функционалом.
Панель статуса
Панель статуса дает широкий спектр возможностей для выхода из приложения, поэтому от нее необходимо избавиться.
Первое, что можно сделать, — задать приложению полноэкранный режим.
До версии 4.0 можно также указать тип окна TYPE_SYSTEM_ALERT — в этом случае приложение-киоск будет показываться поверх всех системных элементов.
Еще один способ — сворачивать статус бар, как только он готов развернуться. Для этого необходимо указать разрешение в манифесте.
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/> @override public void onWindowFocusChanged(boolean hasFocus) { if(!hasFocus) { Object service = getSystemService("statusbar"); Class<?> statusbarManager = Class.forName("android.app.StatusBarManager"); Method collapse = statusbarManager.getMethod("collapse"); collapse .setAccessible(true); collapse .invoke(service); } }
Начиная с Android 4.1 для сокрытия панели статуса можно использовать SDK.
View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); ActionBar actionBar = getActionBar(); actionBar.hide();
Еще один популярный метод: создание прозрачного объекта View, который перехватывает все клики, на месте статус бара. Для реализации требуется флаг SYSTEM_ALERT_WINDOW.
Описанные методы — это далеко не полный перечень вариантов блокировки системных элементов в Android. Разработчики постоянно находят или изобретают что-то новое, делятся опытом, и создают приложения-киоски, обойти ограничения в которых не способен ни один, даже самый хитрый пользователь.
Поделитесь с нами своими секретами создания мобильных киосков под Android: используете ли вы способы, описанные в статье, какие достоинства и недостатки находите в них, и какие еще хаки вам известны.
Комментарии