Skip to content

Developing SreenLock (개발하기)

xcoda edited this page Dec 14, 2012 · 1 revision

화면잠금, 패스워드 초기화, 카메라 비활성화… 뭐 이런걸 하기 위해서는 그냥 앱은 할 수가 없습니다.
관리자 권한(Device Administration)이라는 것이 허락되어야 만 가능한데요.
안드로이드에서는 이와 관련한 일련의 과정을 개발자 사이트를 통해 잘 설명해 주고 있습니다.

이제 개발 과정을 알기 쉽게 설명 드릴께요.

화면잠금을 위해서 필요한 코드는 오직 이 한줄의 코드 입니다.

((DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE)).lockNow();

하지만, 앞서 설명드린 관리자 권한을 가지고 있지 않으면 이 코드는 아무런 일도 하지 않습니다.
관리자 권한을 가지고 있는지를 확인하는 코드는 아래와 같습니다.
deviceMgr.isAdminActive(comp)

여기서 false 값이 반환되면 관리자 권한을 요청하는 코드를 추가로 실행해야 합니다.
우선 Intent 를 새로 만들어서 DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN Action을 지정합니다.

Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

그러면 관리자 권한 허락을 요구하는 화면이 뜰겁니다.
이때 보여줄 메세지를 Intent 에 전달 할 수 있습니다.
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, getString(R.string.devicePolicyManagerMessage));

그리고나서 사용자가 허락 또는 취소 버튼을 누르면 반응할 코드가 있어야 할텐데요.
이때 반응할 코드는 BroadcastReceiver로 구현하게 되어 있습니다.
우선 여기서는 ScreenLockDeviceAdminReceiver 로 구현했다고 가정하고 이렇게 지정 할 수 있습니다.

ComponentName comp = new ComponentName(this, AdminReceiver.class);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, comp);

이제 모든 설정이 완료 되었으니, 실행합니다.
이 과정의 코드를 모두 합하면 아래 처럼 되겠군요.

ComponentName comp = new ComponentName(this, AdminReceiver.class);
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, comp);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, getString(R.string.devicePolicyManagerMessage));
startActivityForResult(intent, 0);

ScreenLock 앱에서는 MainActivity.java 에 구현되어 있는 내용입니다.

앞서 구현되어 있다고 가정한 BroadCastRecevier는 android.app.admin.DeviceAdminReceiver 를 상속받아 구현해야 합니다.
여기에서 우리는 2개의 메서드를 Override 할 수 있습니다.

  • public void onEnabled(Context context, Intent intent)
  • public void onDisabled(Context context, Intent intent)

메서드는 당연히 사용자가 관리자 권한이 활성화 되었을때와 비활성화 됐을때 호출되겠구요.

이 앱에서는 비활성화 때 앱을 제거 하기 위한 코드를 실행 했습니다.

	public void onDisabled(Context context, Intent intent) {
		super.onDisabled(context, intent);
		Toast.makeText(context, R.string.disableDeviceAdmin, Toast.LENGTH_LONG).show();
		Uri uri = Uri.fromParts("package", "net.xcoda.android.screenlock", null);
		Intent i = new Intent(Intent.ACTION_DELETE,uri );
		i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		context.startActivity(i);
	}

이 코드는 ScreenLockDeviceAdminReceiver.java 에 구현되어 있습니다.

이제 manifest.xml에 recevier로 등록해야 하는데요, 우선 아래 내용이 필요합니다.

  • android:permission="android.permission.BIND_DEVICE_ADMIN"
  • intent-filter : <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />

이때 Device Administrator Policy의 어떤 내용을 사용하는 지를 나타내는 xml을 작성해야 합니다.
기본 형태는 아래와 같습니다.


<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-policies>
    <limit-password />
    <watch-login />
    <reset-password />
    <force-lock />
    <wipe-data />
    <expire-password />
    <encrypted-storage />
    <disable-camera />


여기에서 필요한 policy만을 기재해서 xml 을 작성한뒤 이것을 manifest.xml의 recevier에 meta-data 요소로 지정해야 합니다.

<meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/screenlock_admin" />

끝으로, Device Administrator가 활성화된 앱은 어플리케이션 관리자를 통해 제거할 수 가 없습니다.
그래서 RemoveActivity.java 가 필요합니다.
여기서 deviceMgr.isAdminActive(cmpName) 을 이용해서 활성화 여부를 확인하고 true 가 반환되면
deviceMgr.removeActiveAdmin(cmpName); 를 호출해서 비활성화 시킵니다.
그러고 나면 ScreenLockDeviceAdminReceiver.java 에서 구현된 onDisabled(Context context, Intent intent) 이 호출되게 되고 결국 그 곳에 구현된 삭제 기능이 실행되게 됩니다.

Clone this wiki locally