티스토리 뷰
안녕하세요 박스여우입니다.
새롭게 맡은 프로젝트에서 기존 기기의 잠금화면 말고 앱 자체의 잠금화면 기능이 필요했는데요, 홈키나 멀티테스킹 키를 막는게 가장 골치아팠습니다. 그래서 구글링을 해 본 결과 좋은 오픈소스가 있어서 소개해 드리고자 합니다.
HomeKeyLocker.class 생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; import android.view.Gravity; import android.view.MotionEvent; import android.view.WindowManager; import android.widget.FrameLayout; import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; //https://github.com/shaobin0604/Android-HomeKey-Locker public class HomeKeyLocker { private OverlayDialog mOverlayDialog; public void lock(Activity activity) { if (mOverlayDialog == null) { mOverlayDialog = new OverlayDialog(activity); mOverlayDialog.show(); } } public void unlock() { if (mOverlayDialog != null) { mOverlayDialog.dismiss(); mOverlayDialog = null; } } private static class OverlayDialog extends AlertDialog { public OverlayDialog(Activity activity) { super(activity, R.style.OverlayDialog); WindowManager.LayoutParams params = getWindow().getAttributes(); params.type = TYPE_SYSTEM_ERROR; params.dimAmount = 0.0F; // transparent params.width = 0; params.height = 0; params.gravity = Gravity.BOTTOM; getWindow().setAttributes(params); getWindow().setFlags(FLAG_SHOW_WHEN_LOCKED | FLAG_NOT_TOUCH_MODAL, 0xffffff); setOwnerActivity(activity); setCancelable(false); } public final boolean dispatchTouchEvent(MotionEvent motionevent) { return true; } protected final void onCreate(Bundle bundle) { super.onCreate(bundle); FrameLayout framelayout = new FrameLayout(getContext()); framelayout.setBackgroundColor(0); setContentView(framelayout); } } } | cs |
R.Style 에 추가
1 2 3 4 5 6 7 8 9 10 11 12 | <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> <style name="OverlayDialog" parent="@android:style/Theme.Dialog"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowFrame">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">true</item> <item name="android:windowIsTranslucent">false</item> <item name="android:backgroundDimEnabled">false</item> </style> | cs |
위와같이 세팅한 뒤에 Activity를 대상으로 Lock UnLock을 할 수 있습니다.
HomeKeyLocker homeKeyLoader = new HomeKeyLocker();
homeKeyLoader.lock(this);
해당 오픈소스는 홈키나 멀티테스킹 키를 직접적으로 막는게 아니라 Dialog를 띄워서 키가 눌려도 묵살시키는 원리인 것 같습니다.
마지막으로 주의해야 할 점은 베가 아이언이나 G3와 같이 홈키가 버튼이 아니라 소프트키일 경우 Lock이 걸리지 않는다는 단점이 있습니다.
출처 : https://github.com/shaobin0604/Android-HomeKey-Locker
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 - 잠금화면 위에 Activity (448) | 2016.05.11 |
---|---|
Fuse (Fusetool) - OpenGL을 사용한 UI, 크로스 플랫폼 (408) | 2016.04.26 |
안드로이드 캐시(Cache) 사용하기 (419) | 2016.02.15 |
안드로이드 스튜디오 - Package Rename 패키지 이름변경 (3) | 2016.02.12 |
안드로이드 기기 식별 방법 - UUID(Universally unique identifier) (0) | 2016.02.08 |
댓글