App 개발 : 잠금화면- 원격잠금[DevicePolicyManager]

2013. 4. 29. 17:31프로그래밍/안드로이드

DPM이 제공하는 기능들

- DPM이 제공하는 기능


필요한 기능

- 위 기능들 중 원격잠금을 사용하기 위한 몇 가지.

1. 기기권한 Setting : 기기권한 여부, 기기권한 획득, 기기권한 해제

- DPM 기능들을 사용하기 위해 기기 권한을 획득해야 함.

2. 화면잠금 : LockNow

- 화면을 잠그는 DPM 메소드

3. 비밀번호 : 비밀번호 사용 상태 확인, 비밀번호 설정 액티비티 호출

- 원격잠금 사용을 위해 현재 단말기에서 비밀번호가 사용 중인지 확인


프로젝트 생성

- 안드로이드 프로젝트를 생성합니다.

- 저는 ex_dpm으로 생성하였습니다.


기기권한 환경설정

- 기기권한을 사용하기 위해서는 안드로이드 프로젝트를 생성 후 xml, 리시버 등록, 리시버 클래스 생성 3가지를 우선 설정해야 한다.


1. xml 만들기



가. Package Explorer 에서 해당 패키지의 리소스 폴더 아래에 xml 폴더를 만든다.

나. xml 폴더 내부에 xml 파일을 생성한다.

- 저는 device_admin.xml로 생성하였습니다.

다. xml 파일에 아래 내용을 작성한다.

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-policies>

        <limit-password />

        <watch-login />

        <reset-password />

        <force-lock />

        <wipe-data />

    </uses-policies>

</device-admin>


2. 리시버 클래스 생성



가. 우선 DPM 리시버 클래스를 생성 할 액티비티를 생성합니다.

- 저는 EX_DPM.class 로 생성하였습니다.

나. 생성한 액티비티에 DPM 리시버 클래스를 작성합니다.

- 저는 DpmClass 로 생성하였습니다.


//DPM 리시버 클래스

public static class DpmClass extends DeviceAdminReceiver{

  static SharedPreferences getSamplePreferences(Context context) {

  return context.getSharedPreferences(DeviceAdminReceiver.class.getName(), 0);

  };

   

   void showToast(Context context, CharSequence msg) {

    Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();

   }

   

   @Override

   public void onEnabled(Context context, Intent intent) {

   //기기권한이 설정되었을 경우

    showToast(context, "Device Admin enabled");

   }

   @Override

   public CharSequence onDisableRequested(Context context, Intent intent) {

    return "This is an optional message to warn the user about disabling.";

   }

   @Override

   public void onDisabled(Context context, Intent intent) {

    //기기 권한이 해제 됬을 경우

    showToast(context, "Device Admin Disabled");

   }

   @Override

   public void onPasswordChanged(Context context, Intent intent) {

    //패스워드 상태가 변경되었을 경우

    showToast(context, "Password Change");

   }

   @Override

   public void onPasswordFailed(Context context, Intent intent) {

    //패스워드 입력이 실패했을 겨우

    showToast(context, "PasswordFailed");

   }

   @Override

   public void onPasswordSucceeded(Context context, Intent intent) {

    //패스워드를 정상적으로 입력했을 경우

    showToast(context, "PasswordSucceeded");

   }

}


3. 매니패스트에 등록



가. 매니패스트.xml 파일을 연다.

나. 아래 리시버를 등록한다.


//리시버

 <receiver

            android:name=".Ex_DPM$DpmClass"

            android:permission="android.permission.BIND_DEVICE_ADMIN" >

            <meta-data android:name="android.app.device_admin"

                android:resource="@xml/device_admin" />

            <intent-filter>

                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />

            </intent-filter>

</receiver>


기기권한 메소드 사용

- 저는 메인 액티비티에서 함수들을 호출하였습니다.

- 메인 액티비티는 Preferences 액티비티 리스트 형식으로 작성하였으며, 별도의 설명은 하지 않겠습니다.


1. 객체 생성

- DPM 함수를 호출하기 위한 액티비티에 객체 생성



//객체 생성

public static DevicePolicyManager devicePolicyManager;

public static ComponentName adminComponent;


2. 생성자 생성

- DPM 함수 호출을 위해 생성자를 생성합니다.



//생성자 생성

adminComponent = new ComponentName(this, DpmClass.class);

devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);


3. DPM 함수 호출

- DPM 함수를 호출하기 위해서는 우선 기기권한을 획득해야 한다.

//사용 함수 설명

- isAdminActive : 현재 기기권한 활성화 상태를 Boolean 값으로 반환한다.

- removeActiveAdmin : 기기권한 활성화 해제

- lockNow : 화면잠금


가. 기기권한 획득하기

- 현재 기기권한이 사용 중인지 확인하고 사용 중이지 않으면 기기권한 활성화 액티비티를 호출한다.


//소스

if (!devicePolicyManager.isAdminActive(adminComponent)){        

        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

  intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, adminComponent);

  intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,

  "Additional text explaining why this needs to be added.");

  startActivityForResult(intent, 1);

}


나. 기기권한 해제

- 기기권한 활성화 상태를 확인하고 활성화 되어 있으면 해제한다.


//소스

if (devicePolicyManager.isAdminActive(adminComponent)){

devicePolicyManager.removeActiveAdmin(adminComponent);

}


다. 화면잠금

- 화면을 잠근다.


// 소스

if (devicePolicyManager.isAdminActive(adminComponent))

devicePolicyManager.lockNow();


라. 비밀번호 설정 액티비티 호출

- 비밀번호를 설정하는 액티비티를 호출한다.


//소스

Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);

startActivity(intent);


마. 현재 비밀번호 활성화 상태확인

- 현재 비밀번호 사용 여부 확인

- is_pass 는 Boolean 변수 입니다. True : 비밀번호 사용 중, False : 비밀번호 미사용



//소스

final boolean isPattern = 1 ==

android.provider.Settings.System.getLong(getContentResolver(),

android.provider.Settings.System.LOCK_PATTERN_ENABLED);

long mode = android.provider.Settings.Secure.getLong(getContentResolver(),

PASSWORD_TYPE_KEY);

final boolean isPassword =

DevicePolicyManager.PASSWORD_QUALITY_NUMERIC == mode

|| DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == mode

|| DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == mode;


is_pass = isPassword || isPattern;


실행 결과