티스토리 뷰

안녕하세요 박스여우입니다.

새롭게 맡은 프로젝트에서 기존 기기의 잠금화면 말고 앱 자체의 잠금화면 기능이 필요했는데요, 홈키나 멀티테스킹 키를 막는게 가장 골치아팠습니다. 그래서 구글링을 해 본 결과 좋은 오픈소스가 있어서 소개해 드리고자 합니다.


HomeKeyLocker.java

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

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
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
글 보관함