특수한 하드웨어와 소프트웨어를 갖춘 단말기의 하나로, 커뮤니케이션, 상업, 엔터테인먼트, 교육을 위한 정보 및 애플리케이션에 대한 접근 권한을 제공한다.
안드로이드 앱 권한에 관하여,
일반 앱: 일반적인 방법으로 안드로이드 기기에 설치한 앱이다.
관리자(Admin) 앱: 일반 앱에서 사용자의 권한 요청과 수락의 과정으로 관리자(Admin) 권한을 가지는 앱이 될 수 있다. 관리자 권한은 다음에 살펴보겠지만, XML 정책 파일에 필요한 권한을 명시해서 권한을 요청한다. 이 과정은 일반 앱의 퍼미션 요청 및 수락 과정과 비슷하다.
소유자(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)