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

автор Анна Воронова

9 Июн 2015

Киоски окружают нас повсюду. Конечно, сегодня речь не пойдет о ларьках, в которых можно купить мороженое или лимонад — мы поговорим о мобильных информационных киосках.

Обычный информационный киоск представляет собой терминал с установленным программным обеспечением, с которым пользователь может совершать ограниченный набор действий. Самые распространенные примеры: банкоматы, фотокабинки, автоматы по продаже билетов, автоматы для выдачи талончиков в очередь и другие.

Киоски могут использовать различные технологии: сенсорный экран, купюроприемник, фото и видеокамеры, принтеры и сканеры, 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: используете ли вы способы, описанные в статье, какие достоинства и недостатки находите в них, и какие еще хаки вам известны.

  • 0 Репосты

Комментарии

Фильтр

Закрыть

Технологии

Индустрии