Android 4.0シールドホームキー実装

2244 ワード

最近、スクリーンロックを研究したが、従来の方法に従って、従来の方法は以下の通りである.

    public void onAttachedToWindow()  
    {   
            this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);      
           super.onAttachedToWindow();   
    }   

しかし、この方法は4.0のシステムでは失効し、homeでデスクトップに戻ります.Apktoolはいくつかのスクリーンロックソフトウェアを発見した後、WindowManagerのaddviewメソッドでウィンドウにviewを追加し、追加するときにviewのlayoutparamsのtypeをLayoutParamsに設定する実現方法を発見した.TYPE_SYSTEM_ERROR、この値sdkの解釈は

  public static final int TYPE_SYSTEM_ERROR   
    Since: API Level 1   
    Window type: internal system error windows, appear on top of everything they can.   

 
そのまま使うと誤報になりますAndroid Manifestで.xmlに権限,ok上の完全なコードを追加し,ロックとhideメソッドがロックスクリーンとロック解除を実現するクラスをカプセル化した.

public class LockLayer {  
    private Activity mActivty;  
    private WindowManager mWindowManager;  
    private View mLockView;  
    private LayoutParams mLockViewLayoutParams;  
      
    public LockLayer(Activity act) {  
        mActivty = act;  
        init();  
    }  
  
    private void init(){  
        mWindowManager = mActivty.getWindowManager();  
        mLockViewLayoutParams = new LayoutParams();  
        mLockViewLayoutParams.width = LayoutParams.MATCH_PARENT;  
        mLockViewLayoutParams.height = LayoutParams.MATCH_PARENT;  
        //      
        mLockViewLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR;  
        //apktool value,                  
        mLockViewLayoutParams.flags = 1280;  
    }  
    public void lock() {  
        if(mLockView!=null){  
            mWindowManager.addView(mLockView, mLockViewLayoutParams);  
        }  
    }  
    public void unlock() {  
        if(mWindowManager!=null){  
            mWindowManager.removeView(mLockView);  
        }  
    }  
    public void setLockView(View v){  
        mLockView = v;  
    }  
}