Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android應用開發教程之二十四:屏幕鎖定詳解

Android應用開發教程之二十四:屏幕鎖定詳解

編輯:關於android開發

  最近在一個視頻項目中遇到了很多屏幕鎖定的問題,自己也在學習,網上找了下也沒太詳細的例子,看的資料書上也沒有有關屏幕鎖定程序的介紹,從之前寫的文章中抽過來放研究院中,希望能幫助更多想了解或學習屏幕鎖的朋友們學習研究,自己照著官方文檔學習下,現在做好了,廢話不多說,先發下截圖,看下效果,需要注意的地方會加注釋,有問題的朋友可以直接留言,我們共同學習交流,共同提高進步!直接看效果圖:

  一:未設置密碼時進入系統設置的效果圖如下:

Android應用開發教程之二十四:屏幕鎖定詳解

  二:運行DEMO,進入應用時:

Android應用開發教程之二十四:屏幕鎖定詳解

  三:設置密碼方式預覽:

Android應用開發教程之二十四:屏幕鎖定詳解

  四:只設置密碼保護時的效果圖

Android應用開發教程之二十四:屏幕鎖定詳解

  五:密碼解密效果圖

Android應用開發教程之二十四:屏幕鎖定詳解

  六:設置九宮格加密時的效果圖

Android應用開發教程之二十四:屏幕鎖定詳解

  七:九宮格解密時的效果圖

Android應用開發教程之二十四:屏幕鎖定詳解

  八:解密成功後,進入我們手機系統的圖

Android應用開發教程之二十四:屏幕鎖定詳解

  下面來簡單的看下源碼吧,此處講下,這個小DEMO也是臨時學習下的,有講的不明白的地方請朋友直接批評指出,有錯肯定改的,吼吼..看代碼:

  主控制類:

Java代碼
  1. package com.xiaoma.policymanager.demo;   
  2.    
  3. import android.app.Activity;  
  4. import android.app.admin.DevicePolicyManager;  
  5. import android.content.Intent;  
  6. mport android.content.SharedPreferences;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.widget.AdapterView;  
  10. import android.widget.ArrayAdapter;  
  11. import android.widget.Button;  
  12. import android.widget.EditText;  
  13. import android.widget.LinearLayout;  
  14. mport android.widget.Spinner;  
  15. import android.widget.TextView;   
  16.    
  17. /** 
  18. * @Title: PolicySetupActivity.java 
  19. * @Package com.xiaoma.policymanager.demo 
  20. * @Description: 屏幕鎖實現測試 
  21. * @author MZH 
  22. */  
  23. public class PolicySetupActivity extends Activity {  
  24.     private static final int REQ_ACTIVATE_DEVICE_ADMIN = 10;  
  25.     private static final String SCREEN_ID_KEY = "LAYOUT_ID";   
  26.    
  27.     /**存儲配置信息的SP文件名*/  
  28.     private static final String APP_PREF = "APP_PREF";  
  29.     /**有未知屏幕ID時返回此標識*/  
  30.    private static final int UNKNOWN_SCREEN_ID = -1;   
  31.    
  32.     /**聲明組件*/  
  33.     private Spinner mPasswordQualityInputField;  
  34.     private EditText mPasswordLengthInputField;  
  35.     private EditText mPasswordMinUppercaseInputField;   
  36.    
  37.     /**獲取配置操作類對象*/  
  38.     private Policy mPolicy;  
  39.     /**當前屏幕ID*/  
  40.     private int mCurrentScreenId;   
  41.    
  42.     @Override  
  43.     public void onCreate(Bundle savedInstanceState) {  
  44.         super.onCreate(savedInstanceState);  
  45.         mPolicy = new Policy(this);  
  46.     }   
  47.    
  48.     @Override  
  49.     protected void onResume() {  
  50.         super.onResume();  
  51.         /**獲取本地SP文件中屏幕鎖的配置信息*/  
  52.         SharedPreferences prefs = getSharedPreferences(APP_PREF, MODE_PRIVATE);  
  53.         final int savedScreenId = prefs.getInt(SCREEN_ID_KEY, UNKNOWN_SCREEN_ID);  
  54.         /**如果獲取到的ID為空,則跳轉到設置頁*/  
  55.         if (savedScreenId == UNKNOWN_SCREEN_ID || !mPolicy.isAdminActive()) {  
  56.             setScreenContent(R.layout.activity_policy_setup);  
  57.         /**跳轉到配置詳情頁*/  
  58.         } else {  
  59.             setScreenContent(savedScreenId);  
  60.         }  
  61.     }   
  62.    
  63.    /** 
  64.      * 設置屏幕方法實現,詳細的可以自己看下,我也是邊參照官方文檔,邊學習的 
  65.      * 有好想法..有問題的朋友們可以留言.我們一起學習 
  66.      * @param screenId 
  67.      */  
  68.     private void setScreenContent(final int screenId) {  
  69.         /**記錄當前屏幕ID,並預先存入本地SP配置文件中*/  
  70.         mCurrentScreenId = screenId;  
  71.         setContentView(mCurrentScreenId);  
  72.         getSharedPreferences(APP_PREF, MODE_PRIVATE).edit().putInt(  
  73.                 SCREEN_ID_KEY, mCurrentScreenId).commit();  
  74.         switch (mCurrentScreenId) {  
  75.         case R.layout.activity_policy_setup:  
  76.             initPolicySetupScreen();  
  77.             initNavigation();  
  78.             break;  
  79.         case R.layout.activity_view_policy:  
  80.             initViewPolicyScreen();  
  81.             initNavigation();  
  82.             break;  
  83.         }  
  84.     }   
  85.    
  86.     /** 
  87.      * 關閉頁面時將當前配置寫入本地SP文件中 
  88.      */  
  89.     @Override  
  90.     protected void onPause() {  
  91.         super.onPause();  
  92.         if (mCurrentScreenId == R.layout.activity_policy_setup) writePolicy();  
  93.     }   
  94.    
  95.    @Override  
  96.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  97.         if (requestCode == REQ_ACTIVATE_DEVICE_ADMIN && resultCode == RESULT_OK) {  
  98.             // User just activated the application as a device administrator.  
  99.             setScreenContent(mCurrentScreenId);  
  100.         } else {  
  101.             super.onActivityResult(requestCode, resultCode, data);  
  102.         }  
  103.     }   
  104.    
  105.     /** 
  106.      * 重載返回鍵方法,如果已當前屏幕為已設置密碼頁,則展示詳情 
  107.      */  
  108.     @Override  
  109.     public void onBackPressed() {  
  110.         if (mCurrentScreenId == R.layout.activity_view_policy) {  
  111.             setScreenContent(R.layout.activity_policy_setup);  
  112.             return;  
  113.         }  
  114.         super.onBackPressed();  
  115.     }   
  116.    
  117.     /** 
  118.      * 初始化化設置頁 
  119.      */  
  120.     private void initPolicySetupScreen() {  
  121.         mPasswordQualityInputField = (Spinner) findViewById(R.id.policy_password_quality);  
  122.         mPasswordLengthInputField = (EditText) findViewById(R.id.policy_password_length);  
  123.         mPasswordMinUppercaseInputField = (EditText) findViewById(R.id.policy_password_uppercase);  
  124.         ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,  
  125.                 R.array.password_types, android.R.layout.simple_spinner_item);  
  126.         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);  
  127.         mPasswordQualityInputField.setAdapter(adapter);  
  128.         mPasswordQualityInputField.setOnItemSelectedListener(  
  129.                 new AdapterView.OnItemSelectedListener() {  
  130.             public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {  
  131.                 LinearLayout passwordMinUppercaseView =  
  132.                         (LinearLayout) findViewById(R.id.password_uppercase_view);  
  133.                 // The minimum number of upper case field is only applicable for password  
  134.                 // qualities: alpha, alphanumeric, or complex.  
  135.                 if (pos > 2)  
  136.                     passwordMinUppercaseView.setVisibility(View.VISIBLE);  
  137.                 else  
  138.                     passwordMinUppercaseView.setVisibility(View.GONE);  
  139.             }   
  140.    
  141.             public void onNothingSelected(AdapterView<?> parent) {}  
  142.         });   
  143.    
  144.         /**閱讀先前配置的相關信息*/  
  145.         mPolicy.readFromLocal();  
  146.         mPasswordQualityInputField.setSelection(mPolicy.getPasswordQuality());  
  147.         if (mPolicy.getPasswordLength() > 0) {  
  148.             mPasswordLengthInputField.setText(String.valueOf(mPolicy.getPasswordLength()));  
  149.         } else {  
  150.             mPasswordLengthInputField.setText("");  
  151.         }   
  152.    
  153.         if (mPolicy.getPasswordMinUpperCase() > 0) {  
  154.             mPasswordMinUppercaseInputField.setText(  
  155.                     String.valueOf(mPolicy.getPasswordMinUpperCase()));  
  156.         } else {  
  157.             mPasswordMinUppercaseInputField.setText("");  
  158.         }  
  159.     }   
  160.    
  161.     /** 
  162.      * 初始化查看詳情頁 
  163.      */  
  164.     private void initViewPolicyScreen() {  
  165.         TextView passwordQualityView = (TextView) findViewById(R.id.policy_password_quality);  
  166.         TextView passwordLengthView = (TextView) findViewById(R.id.policy_password_length);   
  167.    
  168.         // Read previously saved policy and populate on the UI.  
  169.         mPolicy.readFromLocal();  
  170.         int passwordQualitySelection = mPolicy.getPasswordQuality();  
  171.         passwordQualityView.setText(  
  172.                 getResources().getStringArray(R.array.password_types)[passwordQualitySelection]);  
  173.         passwordLengthView.setText(String.valueOf(mPolicy.getPasswordLength()));  
  174.         if (passwordQualitySelection > 2) {  
  175.             LinearLayout passwordMinUppercaseView =  
  176.                     (LinearLayout) findViewById(R.id.password_uppercase_view);  
  177.             passwordMinUppercaseView.setVisibility(View.VISIBLE);  
  178.             ((TextView) findViewById(R.id.policy_password_uppercase)).setText(  
  179.                     String.valueOf(mPolicy.getPasswordMinUpperCase()));  
  180.         }  
  181.     }   
  182.    
  183.     /** 
  184.      * 設置導航信息 
  185.      */  
  186.     private void initNavigation() {  
  187.         if (!mPolicy.isAdminActive()) {  
  188.             // Activates device administrator.  
  189.             setupNavigation(R.string.setup_message_activate,  
  190.                     R.string.setup_action_activate,  
  191.                     mActivateButtonListener);  
  192.         } else if (mCurrentScreenId == R.layout.activity_policy_setup) {  
  193.             setupNavigation(R.string.setup_message_set_policy,  
  194.                     R.string.setup_action_set_policy,  
  195.                     new View.OnClickListener() {  
  196.                         public void onClick(View view) {  
  197.                             writePolicy();  
  198.                             mPolicy.configurePolicy();  
  199.                             setScreenContent(R.layout.activity_view_policy);  
  200.                         }  
  201.                     });  
  202.         }  
  203.         else if (!mPolicy.isActivePasswordSufficient()) {  
  204.             // Launches password set-up screen in Settings.  
  205.             setupNavigation(R.string.setup_message_enforce_policy,  
  206.                     R.string.setup_action_enforce_policy,  
  207.                     mEnforcePolicyListener);  
  208.         } else {  
  209.             // Grants access to secure content.  
  210.             setupNavigation(R.string.setup_message_go_secured,  
  211.                     R.string.setup_action_go_secured,  
  212.                     new View.OnClickListener() {  
  213.                         public void onClick(View view) {  
  214.                             startActivity(new Intent(view.getContext(), SecureActivity.class));  
  215.                         }  
  216.                     });  
  217.         }  
  218.     }   
  219.    
  220.     /** 
  221.      * 監聽器實現,這個不多講了. 
  222.      */  
  223.     private View.OnClickListener mActivateButtonListener = new View.OnClickListener() {  
  224.         @Override  
  225.         public void onClick(View v) {  
  226.             // First, persist the policy.  Then, launch intent to trigger the system screen  
  227.             // requesting user to confirm the activation of the device administrator.  
  228.             writePolicy();  
  229.             Intent activateDeviceAdminIntent =  
  230.                 new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);  
  231.             activateDeviceAdminIntent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,  
  232.                     mPolicy.getPolicyAdmin());  
  233.             // It is good practice to include the optional explanation text to explain to  
  234.             // user why the application is requesting to be a device administrator.  The system  
  235.             // will display this message on the activation screen.  
  236.             activateDeviceAdminIntent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,  
  237.                     getResources().getString(R.string.device_admin_activation_message));  
  238.             startActivityForResult(activateDeviceAdminIntent, REQ_ACTIVATE_DEVICE_ADMIN);  
  239.         }  
  240.     };   
  241.    
  242.     /** 
  243.      * 監聽器實現,這個也不多講了. 
  244.      */  
  245.     private View.OnClickListener mEnforcePolicyListener = new View.OnClickListener() {  
  246.         @Override  
  247.         public void onClick(View v) {  
  248.             writePolicy();  
  249.             // The device administration API does not "fix" the password if it is  
  250.             // determined that the current password does not conform to what is requested  
  251.             // by the policy.  The caller is responsible for triggering the password set up  
  252.             // screen via the below intent.  
  253.             Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);  
  254.             startActivity(intent);  
  255.         }  
  256.     };   
  257.    
  258.     /** 
  259.      * 設置激活按鈕不同狀態時的文本信息 
  260.      * @param messageResId 
  261.      * @param buttonTextResId 
  262.      * @param listener 
  263.      */  
  264.     private void setupNavigation(int messageResId, int buttonTextResId,  
  265.             View.OnClickListener listener) {  
  266.         TextView setupMessage = (TextView) findViewById(R.id.setup_message);  
  267.         setupMessage.setText(messageResId);  
  268.         Button actionBtn = (Button) findViewById(R.id.setup_action_btn);  
  269.         actionBtn.setText(buttonTextResId);  
  270.         actionBtn.setOnClickListener(listener);  
  271.     }   
  272.    
  273.     // 在關閉此頁時,將配置信息寫入本地SP文件中.  
  274.     private void writePolicy() {  
  275.         int passwordQuality = (int) mPasswordQualityInputField.getSelectedItemId();   
  276.    
  277.         int passwordLength = 0;  
  278.         try {  
  279.             passwordLength = Integer.valueOf(mPasswordLengthInputField.getText().toString());  
  280.         } catch (NumberFormatException nfe) {}  // Defaults to 0.   
  281.    
  282.         int passwordMinUppercase = 0;  
  283.         try {  
  284.             passwordMinUppercase =  
  285.                     Integer.valueOf(mPasswordMinUppercaseInputField.getText().toString());  
  286.         } catch (NumberFormatException nfe) {}  // Defaults to 0.   
  287.    
  288.         mPolicy.saveToLocal(passwordQuality, passwordLength, passwordMinUppercase);  
  289.     }  
  290. }  

  配置操作類:

Java代碼
  1. package com.xiaoma.policymanager.demo;   
  2.    
  3. import android.app.Activity;  
  4. import android.app.admin.DeviceAdminReceiver;  
  5. import android.app.admin.DevicePolicyManager;  
  6. import android.content.ComponentName;  
  7. import android.content.Context;  
  8. import android.content.Intent;  
  9. import android.content.SharedPreferences;  
  10. import android.os.Build;   
  11.    
  12. /** 
  13. * @Title: Policy.java 
  14. * @Package com.xiaoma.policymanager.demo 
  15. * @Description: 用來獲取相關安全配置信息的類 
  16. * @author MZH 
  17. */  
  18. public class Policy {  
  19.     public static final int REQUEST_ADD_DEVICE_ADMIN = 1;   
  20.    
  21.     /**保存屏幕鎖相關參數的SP文件名*/  
  22.     private static final String APP_PREF = "APP_PREF";  
  23.     /**下面三個是往SP中存儲時的Key*/  
  24.     private static final String KEY_PASSWORD_LENGTH = "PW_LENGTH";  
  25.     private static final String KEY_PASSWORD_QUALITY = "PW_QUALITY";  
  26.     private static final String KEY_PASSWORD_MIN_UPPERCASE = "PW_MIN_UPPERCASE";   
  27.    
  28.     /** 
  29.      * 下面是可允許輸入密碼的類型,此處的類型必須與string.xml文件中定義的arrays.xml中的相匹配 
  30.      */  
  31.     final static int[] PASSWORD_QUALITY_VALUES = new int[] {  
  32.         DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED,  
  33.         DevicePolicyManager.PASSWORD_QUALITY_SOMETHING,  
  34.         DevicePolicyManager.PASSWORD_QUALITY_NUMERIC,  
  35.         DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC,  
  36.         DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC,  
  37.         DevicePolicyManager.PASSWORD_QUALITY_COMPLEX  
  38.     };   
  39.    
  40.     private int mPasswordQuality;  
  41.     private int mPasswordLength;  
  42.     private int mPasswordMinUpperCase;  
  43.     private Context mContext;  
  44.     private DevicePolicyManager mDPM;  
  45.     private ComponentName mPolicyAdmin;   
  46.    
  47.     /** 
  48.      * 構造器,在new此類對象時,獲取系統級管理員對象 DevicePolicyManager 
  49.      * @param context 
  50.      */  
  51.     public Policy(Context context) {  
  52.         mContext = context;  
  53.         mPasswordQuality = -1;  
  54.         mPasswordLength = 0;  
  55.         mPasswordMinUpperCase = 0;  
  56.         mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);  
  57.         mPolicyAdmin = new ComponentName(context, PolicyAdmin.class);  
  58.     }   
  59.    
  60.     /** 
  61.      * 保存設備參數 
  62.      */  
  63.     public void saveToLocal(int passwordQuality, int passwordLength, int passwordMinUppercase) {  
  64.         SharedPreferences.Editor editor =  
  65.                 mContext.getSharedPreferences(APP_PREF, Context.MODE_PRIVATE).edit();  
  66.         if (mPasswordQuality != passwordQuality) {  
  67.             editor.putInt(KEY_PASSWORD_QUALITY, passwordQuality);  
  68.             mPasswordQuality = passwordQuality;  
  69.         }  
  70.         if (mPasswordLength != passwordLength) {  
  71.             editor.putInt(KEY_PASSWORD_LENGTH, passwordLength);  
  72.             mPasswordLength = passwordLength;  
  73.         }  
  74.         if (mPasswordMinUpperCase != passwordMinUppercase) {  
  75.             editor.putInt(KEY_PASSWORD_MIN_UPPERCASE, passwordMinUppercase);  
  76.             mPasswordMinUpperCase = passwordMinUppercase;  
  77.         }  
  78.         editor.commit();  
  79.     }   
  80.    
  81.     /** 
  82.      * 從本地SP文件中獲取密碼配置參數 
  83.      */  
  84.     public void readFromLocal() {  
  85.         SharedPreferences prefs = mContext.getSharedPreferences(APP_PREF, Context.MODE_PRIVATE);  
  86.         mPasswordQuality = prefs.getInt(KEY_PASSWORD_QUALITY, -1);  
  87.         mPasswordLength = prefs.getInt(KEY_PASSWORD_LENGTH, -1);  
  88.         mPasswordMinUpperCase = prefs.getInt(KEY_PASSWORD_MIN_UPPERCASE, -1);  
  89.     }   
  90.    
  91.     /** 
  92.      * 獲取密碼. 
  93.      * 
  94.      * @return 
  95.      */  
  96.     public int getPasswordQuality() { return mPasswordQuality; }   
  97.    
  98.     /** 
  99.      * 獲取密碼長度. 
  100.      * 
  101.      * @return 
  102.      */  
  103.     public int getPasswordLength() { return mPasswordLength; }   
  104.    
  105.     /** 
  106.      * 獲取字母密碼. 
  107.      * 
  108.      * @return 
  109.      */  
  110.     public int getPasswordMinUpperCase() { return mPasswordMinUpperCase; }   
  111.    
  112.     /** 
  113.      * 獲取設備管理的 ComponentName 對象. 
  114.      * 
  115.      * @return 
  116.      */  
  117.     public ComponentName getPolicyAdmin() { return mPolicyAdmin; }   
  118.    
  119.     /** 
  120.      * 判斷設備是否被激活. 
  121.      * 
  122.      * @return 
  123.      */  
  124.     public boolean isAdminActive() {  
  125.         return mDPM.isAdminActive(mPolicyAdmin);  
  126.     }   
  127.    
  128.     public boolean isActivePasswordSufficient() {  
  129.         return mDPM.isActivePasswordSufficient();  
  130.     }   
  131.    
  132.     /** 
  133.      * 判斷設備是否加安全 
  134.      * @return 
  135.      */  
  136.     public boolean isDeviceSecured() {  
  137.         return isAdminActive() && isActivePasswordSufficient();  
  138.     }   
  139.    
  140.     /** 
  141.      * 在聲明的mDPM對象中進行配置. 
  142.      */  
  143.     public void configurePolicy() {  
  144.         mDPM.setPasswordQuality(mPolicyAdmin, PASSWORD_QUALITY_VALUES[mPasswordQuality]);  
  145.         mDPM.setPasswordMinimumLength(mPolicyAdmin, mPasswordLength);  
  146.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {  
  147.             mDPM.setPasswordMinimumUpperCase(mPolicyAdmin, mPasswordMinUpperCase);  
  148.         }  
  149.     }   
  150.    
  151.     /** 
  152.      * 下面這個類用來監聽各種不同類型的設備管理事件,比如:改變密碼..錯誤密碼等等 
  153.      */  
  154.     public static class PolicyAdmin extends DeviceAdminReceiver {   
  155.    
  156.         @Override  
  157.         public void onDisabled(Context context, Intent intent) {  
  158.             // Called when the app is about to be deactivated as a device administrator.  
  159.             super.onDisabled(context, intent);  
  160.             SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE);  
  161.             /**清除以前在SP文件下保存的所有值*/  
  162.             prefs.edit().clear().commit();  
  163.         }  
  164.     }  
  165. }  

  權限驗證類:

Java代碼
  1. package com.xiaoma.policymanager.demo;   
  2.    
  3. import android.app.Activity;  
  4. import android.content.Intent;   
  5.    
  6. /** 
  7. * @Title: SecureActivity.java 
  8. * @Package com.xiaoma.policymanager.demo 
  9. * @Description: 權限驗證類實現 
  10. * @author MZH 
  11. */  
  12. public class SecureActivity extends Activity {   
  13.    
  14.     @Override  
  15.     protected void onResume() {  
  16.         super.onResume();  
  17.         // Check to see if the device is properly secured as per the policy.  Send user  
  18.         // back to policy set up screen if necessary.  
  19.         Policy policy = new Policy(this);  
  20.         policy.readFromLocal();  
  21.         if (!policy.isDeviceSecured()) {  
  22.             Intent intent = new Intent();  
  23.             intent.setClass(this, PolicySetupActivity.class);  
  24.             intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP |  
  25.                             Intent.FLAG_ACTIVITY_CLEAR_TASK);  
  26.             startActivity(intent);  
  27.             finish();  
  28.         }  
  29.         setContentView(R.layout.activity_secure);  
  30.     }  
  31. }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved