안드로이드 키오스크(Kiosk) 앱 개발 (1/3)

이제 우리는 일상에서 많은 키오스크(Kiosk) 기기를 사용한다. 맥XXX 햄버거 체인점에서 주문하는 기기, 공항에서 층별 정보나 항공사 위치를 확인할 수 있는 기기, 회사 로비에 인포 데스크 없이 방문자를 확인할 수 있는 기기 등이 우리가 주변에서 쉽게 사용하고 있는 키오스크 기기이다. 이 기기 또한 우리가 널리 사용하고 있는 윈도, 리눅스, 안드로이드, IOS 등을 사용한다. 먼저 키오스크의 정의를 살펴보면 아래와 같다.

인터랙티브 키오스크(interactive kiosk)는 특수한 하드웨어와 소프트웨어를 갖춘 단말기의 하나로, 커뮤니케이션, 상업, 엔터테인먼트, 교육을 위한 정보 및 애플리케이션에 대한 접근 권한을 제공한다.

안드로이드 또한 키오스크 기능을 개발할 수 있게 API를 제공하기에, 키오스크 앱을 개발하는 방법과 앱이 키오스크 앱으로 동작하는데 필요한 고려사항에 대해서 세 파트(1/3, 2/3, 3/3)로 나눠서 살펴본다.

우선 키오스크 앱을 개발하기 전에 앱이 획득할 수 있는 권한에 대해서 살펴보자. 안드로이드 앱은 크게 시스템 앱과 일반 앱으로 구분할 수 있고, 안드로이드 제조사나 제조사 파트너의 경우에만 자신의 앱을 시스템 앱으로 배포할 수 있기에, 여기서는 일반 앱을 대상으로 한다. 안드로이드 앱의 권한은 일반 앱 -> 관리자(Admin) 앱 -> 소유자(Owner) 앱의 순으로 안드로이드 기기를 제어할 수 있는 권한을 가지게 된다.

일반 앱: 일반적인 방법으로 안드로이드 기기에 설치한 앱이다.
관리자(Admin) 앱: 일반 앱에서 사용자의 권한 요청과 수락의 과정으로 관리자(Admin) 권한을 가지는 앱이 될 수 있다. 관리자 권한은 다음에 살펴보겠지만, XML 정책 파일에 필요한 권한을 명시해서 권한을 요청한다. 이 과정은 일반 앱의 퍼미션 요청 및 수락 과정과 비슷하다.
소유자(Owner) 앱: 소유자 앱은 삭제할 수 없고, 관리자 권한을 포함해서 안드로이드 기기의 기능 및 앱을 제한할 수 있는 막강한 권한을 가진다.

일반 앱에서 관리자 권한을 요청해서 관리자 앱이 될 수 있지만, 소유자 앱의 경우에는 프로그래밍으로 권한을 얻을 수가 없다. 일반 앱이 소유자 앱이 되는 방법으로 2가지가 있는데 첫 번째가 제조사에서 제공하는 MDM 솔루션을 사용하는 방법이다. 이 경우에는 제조사가 MDM 솔루션을 제공해야 하고, 제공하는 MDM 솔루션을 무료 또는 구매하면 된다. 두 번째 방법은 APK를 프로비저닝(Provisioning)해서 QR 코드나 NFC를 사용해서 앱에 설치하는 방법이 있다. 여기에서 살펴보는 방법은 APK의 QR 코드를 만들고 앱에 소유자 앱으로 설치하는 방법을 살펴볼 것이다. 그리고, APK를 프로비저닝하는 방법은 https://developers.google.com/android/management/provision-device#provisioning_methods 에서 확인할 수 있다.

먼저 일반 앱으로 키오스크 모드 앱을 개발해 보자.

1. 키오스크 모드 시작 및 중지

키오스크 모드는 Activity의 startLockTask() 메서드를 호출해서 시작하고, 중지는 stopLockTask() 메서드를 호출하면 된다.

mStartLockButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    LockUtil.lock(MainActivity.this);
    startLockTask();
  }
});

mEndLockButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    LockUtil.unLock(MainActivity.this);
    stopLockTask();
  }
});

– MainActivity의 키오스크 시작 및 중지 코드

위 코드는 2개의 버튼으로 키오스크 모드를 시작하고 중지하는 것을 볼 수 있고, LockUtil 클래스는 키오스크 모드를 시작했다는 정보를 유지한다. 이 정보를 유지해서 안드로이드 기기가 재시작하는 경우에 바로 MainActivity를 실행시켜서 키오스크 모드를 시작할 수 있게 한다.


– 키오스크 시작화면

일반 앱으로 키오스크 모드를 실행하면, 위 화면과 같은 다이얼로그를 보게 되고 확인을 클릭해야 키오스크 모드로 동작한다. 키오스크 모드로 동작시키기 위해서 앱을 실행해서 매번 확인을 클릭해야 한다면 유지 및 관리 이슈가 클 것이다. 이 이슈는 앱을 소유자 권한으로 실행하고 키오스크 모드를 시작하면 이 이슈를 해결 할 수 있다.

2. 부팅 완료(BOOT_COMPLETED) 브로드 캐스트 추가

브로드 캐스트는 안드로이드 기기가 부팅을 완료한 후에 바로 키오스크 모드로 잠겨야 할 필요가 있는 경우에 사용할 수 있다.


    
        
    

– AndroidManifest.xml에 BootCompleteReceiver 추가

위 코드는 BOOT_COMPLETED 브로드 캐스트를 받아서 처리하는 클래스(BootCompleteReceiver)와 속성에 대해서 정의하고 있다. android:directBootAware=”true”의 경우에는 사용자가 잠금을 해제하지 않고도 실행할 수 있게 한다.

다음으로 BootCompleteReceiver를 살펴보자.

public class BootCompleteReceiver extends BroadcastReceiver {
  static final String TAG = "SIMPLE_KIOSK";

  @Override
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    Log.i(TAG, "onReceive: " + action);
    if(Intent.ACTION_BOOT_COMPLETED.equals(action)) {
        startActivity(context);
    }
  }

  static void startActivity(Context context) {
    Intent i = new Intent(context, MainActivity.class);
    // For Android 9 and below
    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      context.startActivity(i);
      return;
    }
    // Android 10 ?
  }
}

- BootCompleteReceiver 코드

위 코드는 부팅을 완료하면, 안드로이드 OS가 ACTION_BOOT_COMPLETED 액션과 함께 BootCompleteReceiver를 호출한다. 이 액션이 들어온 경우에 MainActivity를 실행하는 것을 알 수 있다. 안드로이드 10의 경우에 백그라운드로 동작하는 컴포넌트에서는 액티비티를 실행할 수 없기에, 현재는 안드로이드 9 및 이하의 버전에서만 안드로이드 시작 후에 MainActivity를 실행해서 바로 키오스크 모드로 동작하게 할 수 있다. 안드로이드 10 버전은 다음에 살펴보도록 하겠다.

아래 영상은 안드로이드 8.1.0 에뮬레이터에서 일반 앱으로 키오스크 모드가 어떻게 동작하는 지를 확인할 수 있고, 안드로이드를 재시작한 뒤에 앱이 자동으로 키오스크 모드로 진입하는 것도 확인할 수 있다.


이 프로젝트의 소스는 https://github.com/mcsong/SimpleKioskDemo에서 확인할 수 있다.

Reference

- https://ko.wikipedia.org/wiki/인터랙티브_키오스크
- https://developer.android.com/guide/topics/admin/device-admin
- https://developer.android.com/work/dpc/dedicated-devices/lock-task-mode