Dev./Android

화면 잠금(Screen off) 어플을 만들자

like miller 2012. 7. 2. 14:16

요즘에는 그런 기기는 없지만 넥서스원의 경우 전원버튼 함몰이라는 하드웨어의 치명적 약점을 가지고 있었습니다. 그래서 넥서스원 유저는 전원 버튼을 덜 쓰게 하기 위해서 화면을 잠궈 주는 어플을 필수로 사용했습니다. 단지 그 이유뿐만 아니라 좀더 편하게 화면을 잠그기 위해서 또는 터치 스크린을 더 활용하기 위해서 이런 앱을 사용하는 경우가 많이 늘고 있습니다.


* 대표적인 앱은 Screen off & lock 입니다.

* 참고로 BkLock도 있습니다.


1. 화면을 잠그는 API 찾기

화면을 잠그는 API를 찾기 위해 일단 생각을 해보자. 화면을 잠근다?? 혹시 PowerManager 클래스에 있지 않을까? 해서 한번 찾아 봤습니다. 찾아 봤더니 goToSleep(long time) 이라는 메소드가 존재 하는 군요. API 설명에도 Force the device to go to sleep. 이라고 단말기를 강제로 sleep 모드로 한다라고 되어 있네요.


PowerManager의 goToSleep()메소드를 테스트 해봤습니다.


PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
pm.goToSleep(2000);


확인을 위해 2초 정도 여유를 줬습니다. 실행을 해보니




Exception이 발생하여 앱이 종료되었습니다. 그래서 log를 살펴보니 아래 처럼 log 내용이 나왔습니다.



퍼미션이 없다고 Exception이 발생했습니다. 그래서 퍼미션을 추가해 주었습니다.

<uses-permission android:name="android.permission.DEVICE_POWER"/>


그리고 다시 실행했습니다. 그랬더니 이번에도 역시 Exception이 발생!!!

퍼미션을 줬는데도 계속 퍼미션 타령으로 안되고 있네요.



그래서 구글링을 해보니 PowerManager의  goToSleep(long time) 메소드는 시스템 키로 사인되어야 사용할 수 있다고 합니다. 즉 서드파티 앱에서는 사용이 불가합니다.


그렇다면 위에 대표적으로 화면을 잠그는 Screen off & lock 앱은 어떻게 화면을 잠글까요?



2. DeviceAdministration

해답은 장치 관리자(디바이스 관리자, 기기 관리자)!!

안드로이드는 프로요(2.2) 이 후, Device Administration API 가 제공되며 시스템 레벨의 디바이스 관리 기능을 제공합니다.

예를 들어 사용자에게 비밀번호 최소 자릿수나 형식을 강제할 수 있고 사용자 입력없이 비밀번호를 바꾸고 단말기를 공장 초기화 하며 SD card 까지 포맷할 수 있습니다. 이런 기능을 원격으로 제어 할 수 도 있습니다. 자세한 내용은 http://developer.android.com/guide/topics/admin/device-admin.html 를 참조하면 됩니다. 2.2 부터 지금까지 계속 기능이 추가되고 있습니다.


실제 화면을 잠그는 메소드는 DevicePolicyManager 클래스의 lockNow() 메소드를 이용하면 된다.


하지만 장치관리자로 앱이 먼저 등록되어야 저 기능을 사용할 수 있다. 장치관리자 등록은 반드시 유저의 입력으로 이루어 져야 한다.


장치관리자를 이용하여 앱을 개발할 때 주의 할 점은 바로 삭제 방법에 대한 공지 입니다.

장치관리자를 이용하면 일반적으로 삭제하듯이 앱을 삭제 할 수 없습니다. 반드시 먼저 장치관리자를 해제한 후에 삭제를 할 수 있습니다. 이러한 부분을 사용자에게 잘 전달 해야 뒷탈이 없을 것 입니다.


실제 소스는 ApiDemos에 있습니다. com.example.android.apis.app 패키지에 DeviceAdminSample.java 파일입니다.

BkLock.zip
0.08MB