天天看點

Android實作利用手勢完成螢幕密碼鎖功能

                               畫筆螢幕鎖小程式

1.如果使用GestureOverlayView,在xml配置檔案中使用android.gesture.GestureOverlayView,否則會報ClassNotFoundException

2.關于判斷MEDIA_MOUNTED,API的解釋:getExternalStorageState() returns MEDIA_MOUNTED if the media ispresent and mounted at its mount point with read/write access.

3.使用了service和broadcastReciever進行監聽,監測到螢幕亮暗進行程式啟動,參考了文章:

 http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/

4.關于android.intent.action.MAIN

決定應用程式最先啟動的Activity

android.intent.category.LAUNCHER

決定應用程式是否顯示在程式清單裡

5.關于R.id的問題,将要import類R所在的包

6.利用了Android SDK範例開發中的GestureOverlayView進行開發畫圖工具

7.實作了在service中啟動activity

  Intent i = new Intent(UpdateService.this,Lock.class);

                 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                 this.startActivity(i);

8. //隐藏界面

                   this.requestWindowFeature(Window.FEATURE_NO_TITLE);

                   this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

Don't call setContentView() before requestFeature().

9.全屏并屏蔽HOME鍵,以及屏蔽傳回鍵,完成辦法。

public booleanonKeyDown(int keyCode,KeyEvent event){

switch(keyCode){

caseKeyEvent.KEYCODE_HOME:return true;

caseKeyEvent.KEYCODE_BACK:return true;

caseKeyEvent.KEYCODE_CALL:return true;

caseKeyEvent.KEYCODE_SYM: return true;

caseKeyEvent.KEYCODE_VOLUME_DOWN: return true;

caseKeyEvent.KEYCODE_VOLUME_UP: return true;

caseKeyEvent.KEYCODE_STAR: return true;

}

returnsuper.onKeyDown(keyCode, event);

}

屏蔽home鍵的代碼:

public voidonAttachedToWindow() {

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);

super.onAttachedToWindow();

}

//出現問題:WindowManager.LayoutParams.TYPE_KEYGUARD以及

            LayoutParams.FLAG_FULLSCREEN出現沖突,無法解決,搜尋網上無解決辦法。

參考文檔:

        \frameworks\policies\base\phone\com\android\internal\policy\impl\PhoneWindowManager.java1089行

if (code ==KeyEvent.KEYCODE_HOME) {

            // If a system window has focus,then it doesn't make sense

            // right now to interact withapplications.

            WindowManager.LayoutParams attrs =win != null ? win.getAttrs() : null;

            if (attrs != null) {

                final int type = attrs.type;

                if (type ==WindowManager.LayoutParams.TYPE_KEYGUARD

                        || type ==WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) {

                    // the "app" iskeyguard, so give it the key

                    return false;

                }

                final int typeCount =WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;

                for (int i=0; i<typeCount;i++) {

                    if (type ==WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {

                        // don't do anything,but also don't pass it to the app

                        return true;

                    }

                }

            }

是以解決問題!

10.出現了傳回HOME頁後重新從程式頁進入,發現又進入開鎖界面:

  經過查詢思考,發現,其實是HOME頁後将程式放入處理棧當中,是以重新進入時就會繼續回到棧頂,并且破壞了全屏效果。

  是以必須實作傳回鍵功能,而不是HOME鍵。

  是以,使用finish();方法就足夠了,狗日的SDK開發,竟然寫了一個外部監聽,不能使用finish方法,後來改寫成内部類,直接搞定。

 根據個人感覺,其實監聽寫内部類還是比較保險的,開發初級階段,慢慢摸索。

  newGestureOverlayView.OnGesturePerformedListener()

最後,上效果圖,4天的結果,還不錯。起碼解決了全屏顯示和屏蔽HOME鍵的問題。

PS:将會對來電開鎖功能進行更新

上圖:

Android實作利用手勢完成螢幕密碼鎖功能
Android實作利用手勢完成螢幕密碼鎖功能
Android實作利用手勢完成螢幕密碼鎖功能