안드로이드 키오스크 모드 정리

Chance·2022년 10월 20일
0

인터랙티브 키오스크(interactive kiosk)

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

안드로이드 앱 권한에 관하여,

  • 안드로이드 앱은 크게 시스템 앱과 일반 앱으로 구분할 수 있고, 안드로이드 제조사나 제조사 파트너의 경우에만 자신의 앱을 시스템 앱으로 배포할 수 있기에, 여기서는 일반 앱을 대상으로 한다.
  • 안드로이드 앱의 권한은 일반 앱 -> 관리자(Admin) 앱 -> 소유자(Owner) 앱의 순으로 안드로이드 기기를 제어할 수 있는 권한을 가지게 된다.
  1. 일반 앱: 일반적인 방법으로 안드로이드 기기에 설치한 앱이다.

  2. 관리자(Admin) 앱: 일반 앱에서 사용자의 권한 요청과 수락의 과정으로 관리자(Admin) 권한을 가지는 앱이 될 수 있다. 관리자 권한은 다음에 살펴보겠지만, XML 정책 파일에 필요한 권한을 명시해서 권한을 요청한다. 이 과정은 일반 앱의 퍼미션 요청 및 수락 과정과 비슷하다.

  3. 소유자(Owner) 앱: 소유자 앱은 삭제할 수 없고, 관리자 권한을 포함해서 안드로이드 기기의 기능 및 앱을 제한할 수 있는 막강한 권한을 가진다.

일반 앱에서 관리자 권한을 요청해서 관리자 앱이 될 수 있지만, 소유자 앱의 경우에는 프로그래밍으로 권한을 얻을 수가 없다.

일반 앱이 소유자 앱이 되는 방법으로 2가지가 있는데,

  • 첫 번째가 제조사에서 제공하는 MDM 솔루션을 사용하는 방법이다.
    이 경우에는 제조사가 MDM 솔루션을 제공해야 하고, 제공하는 MDM 솔루션을 무료 또는 구매하면 된다.

  • 두 번째 방법은 APK를 프로비저닝(Provisioning)해서 QR 코드나 NFC를 사용해서 앱에 설치하는 방법이 있다.
    여기에서 살펴보는 방법은 APK의 QR 코드를 만들고 앱에 소유자 앱으로 설치하는 방법을 살펴볼 것이다.
    그리고, APK를 프로비저닝하는 방법은 확인할 수 있다.

예제 코드
1. 키오스크 모드를 시작하고 중지하는 코드이다.
LockUtil클래스는 키오스크 모드를 시작했다는 정보를 유지한다.
이 정보를 유지하여 안드로이드 기기가 재시작 하는 경우에 바로 MainActivity를 실행시켜서 키오스크 모드를 시작할 수 있게 한다.

    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();

      }
    });

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

<receiver android:name=".BootCompleteReceiver" 
		  android:enabled="true" 
          android:exported="false" 
          android:directbootaware="true" tools:targetapi="n">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

위 코드는 BOOT_COMPLETED 브로드 캐스트를 받아서 처리하는 클래스(BootCompleteReceiver)와 속성에 대해서 정의하고 있다.

android:directBootAware="true"의 경우 사용자가 잠금을 해제하지 않고도 실행할 수 있게 한다.

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 ?
  }
}

위 코드는 부팅이 완료되면 안드로이드 OS가 ACTION_BOOT_COMPLETED액션과 함께 BootCompleteReceiver를 호출한다.

안드로이드 10의 경우 백그라운드로 동작하는 컴포넌트에는 액티비티를 실행할 수 없기에,
현재는 안드로이드 9 및 이하의 버전에서만 시작 후 MainActivity를 실행해서 키오스크 모드로 동작하게 할 수 있다.

기본 홈 앱 설정 (런처)

안드로이드 기기 설정 경로

  • 설정 -> 애플리케이션 (앱) -> 기본 앱 (선택) -> 홈 앱

홈 앱으로 설정하기 위한 소스코드
Manifest.xml

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Design.NoActionBar">
        
        <!--      실행되는 첫 액티비티에 android:launchMode="singleTask" 추가    -->
        <activity android:name=".MainActivity"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <!--        홈 런처 만들때 필요한 선언        -->
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.HOME"/>
                <!--        홈 런처 만들때 필요한 선언        -->

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

소스코드상에서 위와같은 설정 경로를 찾아들어가 셋팅해주는 방법은 없는 듯

홈 화면을 막는 방법 (X)

  • 클릭 시 다시 해당 앱을 실행시키도록 하는 편법 존재

0개의 댓글

관련 채용 정보