最近有朋友问屏幕锁定的问题,小马自己也在学习,网上找了下也没太详细的例子,看的资料书上也没有有关屏幕锁定程序的介绍,下个小决心,自己照着官方文档学习下,现在做好了,小马废话不多说,先发下截图,看下效果,需要注意的地方小马会加注释,有问题的朋友可以直接留言,我们共同学习交流,共同提高进步!直接看效果图:

一:未设置密码时进入系统设置的效果图如下:

二:运行DEMO,进入应用时:

三:设置密码方式预览:

四:只设置密码保护时的效果图

五:密码解密效果图

六:设置九宫格加密时的效果图

七:九宫格解密时的效果图

八:解密成功后,进入我们手机系统的图

下面来简单的看下源码吧,此处讲下,这个小DEMO也是小马临时学习下的,有讲的不明白的地方请朋友直接批评指出,有错肯定改的,吼吼..看代码:

主控制类:

        
  1. packagecom.xiaoma.policymanager.demo;
  2. importandroid.app.Activity;
  3. importandroid.app.admin.DevicePolicyManager;
  4. importandroid.content.Intent;
  5. importandroid.content.SharedPreferences;
  6. importandroid.os.Bundle;
  7. importandroid.view.View;
  8. importandroid.widget.AdapterView;
  9. importandroid.widget.ArrayAdapter;
  10. importandroid.widget.Button;
  11. importandroid.widget.EditText;
  12. importandroid.widget.LinearLayout;
  13. importandroid.widget.Spinner;
  14. importandroid.widget.TextView;
  15. /**
  16. *@Title:PolicySetupActivity.java
  17. *@Packagecom.xiaoma.policymanager.demo
  18. *@Description:屏幕锁实现测试
  19. *@authorMZH
  20. */
  21. publicclassPolicySetupActivityextendsActivity{
  22. privatestaticfinalintREQ_ACTIVATE_DEVICE_ADMIN=10;
  23. privatestaticfinalStringSCREEN_ID_KEY="LAYOUT_ID";
  24. /**存储配置信息的SP文件名*/
  25. privatestaticfinalStringAPP_PREF="APP_PREF";
  26. /**有未知屏幕ID时返回此标识*/
  27. privatestaticfinalintUNKNOWN_SCREEN_ID=-1;
  28. /**声明组件*/
  29. privateSpinnermPasswordQualityInputField;
  30. privateEditTextmPasswordLengthInputField;
  31. privateEditTextmPasswordMinUppercaseInputField;
  32. /**获取配置操作类对象*/
  33. privatePolicymPolicy;
  34. /**当前屏幕ID*/
  35. privateintmCurrentScreenId;
  36. @Override
  37. publicvoidonCreate(BundlesavedInstanceState){
  38. super.onCreate(savedInstanceState);
  39. mPolicy=newPolicy(this);
  40. }
  41. @Override
  42. protectedvoidonResume(){
  43. super.onResume();
  44. /**获取本地SP文件中屏幕锁的配置信息*/
  45. SharedPreferencesprefs=getSharedPreferences(APP_PREF,MODE_PRIVATE);
  46. finalintsavedScreenId=prefs.getInt(SCREEN_ID_KEY,UNKNOWN_SCREEN_ID);
  47. /**如果获取到的ID为空,则跳转到设置页*/
  48. if(savedScreenId==UNKNOWN_SCREEN_ID||!mPolicy.isAdminActive()){
  49. setScreenContent(R.layout.activity_policy_setup);
  50. /**跳转到配置详情页*/
  51. }else{
  52. setScreenContent(savedScreenId);
  53. }
  54. }
  55. /**
  56. *设置屏幕方法实现,详细的可以自己看下,小马也是边参照官方文档,边学习的
  57. *有好想法..有问题的朋友们可以留言.我们一起学习
  58. *@paramscreenId
  59. */
  60. privatevoidsetScreenContent(finalintscreenId){
  61. /**记录当前屏幕ID,并预先存入本地SP配置文件中*/
  62. mCurrentScreenId=screenId;
  63. setContentView(mCurrentScreenId);
  64. getSharedPreferences(APP_PREF,MODE_PRIVATE).edit().putInt(
  65. SCREEN_ID_KEY,mCurrentScreenId).commit();
  66. switch(mCurrentScreenId){
  67. caseR.layout.activity_policy_setup:
  68. initPolicySetupScreen();
  69. initNavigation();
  70. break;
  71. caseR.layout.activity_view_policy:
  72. initViewPolicyScreen();
  73. initNavigation();
  74. break;
  75. }
  76. }
  77. /**
  78. *关闭页面时将当前配置写入本地SP文件中
  79. */
  80. @Override
  81. protectedvoidonPause(){
  82. super.onPause();
  83. if(mCurrentScreenId==R.layout.activity_policy_setup)writePolicy();
  84. }
  85. @Override
  86. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
  87. if(requestCode==REQ_ACTIVATE_DEVICE_ADMIN&&resultCode==RESULT_OK){
  88. //Userjustactivatedtheapplicationasadeviceadministrator.
  89. setScreenContent(mCurrentScreenId);
  90. }else{
  91. super.onActivityResult(requestCode,resultCode,data);
  92. }
  93. }
  94. /**
  95. *重载返回键方法,如果已当前屏幕为已设置密码页,则展示详情
  96. */
  97. @Override
  98. publicvoidonBackPressed(){
  99. if(mCurrentScreenId==R.layout.activity_view_policy){
  100. setScreenContent(R.layout.activity_policy_setup);
  101. return;
  102. }
  103. super.onBackPressed();
  104. }
  105. /**
  106. *初始化化设置页
  107. */
  108. privatevoidinitPolicySetupScreen(){
  109. mPasswordQualityInputField=(Spinner)findViewById(R.id.policy_password_quality);
  110. mPasswordLengthInputField=(EditText)findViewById(R.id.policy_password_length);
  111. mPasswordMinUppercaseInputField=(EditText)findViewById(R.id.policy_password_uppercase);
  112. ArrayAdapter<CharSequence>adapter=ArrayAdapter.createFromResource(this,
  113. R.array.password_types,android.R.layout.simple_spinner_item);
  114. adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  115. mPasswordQualityInputField.setAdapter(adapter);
  116. mPasswordQualityInputField.setOnItemSelectedListener(
  117. newAdapterView.OnItemSelectedListener(){
  118. publicvoidonItemSelected(AdapterView<?>parent,Viewview,intpos,longid){
  119. LinearLayoutpasswordMinUppercaseView=
  120. (LinearLayout)findViewById(R.id.password_uppercase_view);
  121. //Theminimumnumberofuppercasefieldisonlyapplicableforpassword
  122. //qualities:alpha,alphanumeric,orcomplex.
  123. if(pos>2)
  124. passwordMinUppercaseView.setVisibility(View.VISIBLE);
  125. else
  126. passwordMinUppercaseView.setVisibility(View.GONE);
  127. }
  128. publicvoidonNothingSelected(AdapterView<?>parent){}
  129. });
  130. /**阅读先前配置的相关信息*/
  131. mPolicy.readFromLocal();
  132. mPasswordQualityInputField.setSelection(mPolicy.getPasswordQuality());
  133. if(mPolicy.getPasswordLength()>0){
  134. mPasswordLengthInputField.setText(String.valueOf(mPolicy.getPasswordLength()));
  135. }else{
  136. mPasswordLengthInputField.setText("");
  137. }
  138. if(mPolicy.getPasswordMinUpperCase()>0){
  139. mPasswordMinUppercaseInputField.setText(
  140. String.valueOf(mPolicy.getPasswordMinUpperCase()));
  141. }else{
  142. mPasswordMinUppercaseInputField.setText("");
  143. }
  144. }
  145. /**
  146. *初始化查看详情页
  147. */
  148. privatevoidinitViewPolicyScreen(){
  149. TextViewpasswordQualityView=(TextView)findViewById(R.id.policy_password_quality);
  150. TextViewpasswordLengthView=(TextView)findViewById(R.id.policy_password_length);
  151. //ReadpreviouslysavedpolicyandpopulateontheUI.
  152. mPolicy.readFromLocal();
  153. intpasswordQualitySelection=mPolicy.getPasswordQuality();
  154. passwordQualityView.setText(
  155. getResources().getStringArray(R.array.password_types)[passwordQualitySelection]);
  156. passwordLengthView.setText(String.valueOf(mPolicy.getPasswordLength()));
  157. if(passwordQualitySelection>2){
  158. LinearLayoutpasswordMinUppercaseView=
  159. (LinearLayout)findViewById(R.id.password_uppercase_view);
  160. passwordMinUppercaseView.setVisibility(View.VISIBLE);
  161. ((TextView)findViewById(R.id.policy_password_uppercase)).setText(
  162. String.valueOf(mPolicy.getPasswordMinUpperCase()));
  163. }
  164. }
  165. /**
  166. *设置导航信息
  167. */
  168. privatevoidinitNavigation(){
  169. if(!mPolicy.isAdminActive()){
  170. //Activatesdeviceadministrator.
  171. setupNavigation(R.string.setup_message_activate,
  172. R.string.setup_action_activate,
  173. mActivateButtonListener);
  174. }elseif(mCurrentScreenId==R.layout.activity_policy_setup){
  175. setupNavigation(R.string.setup_message_set_policy,
  176. R.string.setup_action_set_policy,
  177. newView.OnClickListener(){
  178. publicvoidonClick(Viewview){
  179. writePolicy();
  180. mPolicy.configurePolicy();
  181. setScreenContent(R.layout.activity_view_policy);
  182. }
  183. });
  184. }
  185. elseif(!mPolicy.isActivePasswordSufficient()){
  186. //Launchespasswordset-upscreeninSettings.
  187. setupNavigation(R.string.setup_message_enforce_policy,
  188. R.string.setup_action_enforce_policy,
  189. mEnforcePolicyListener);
  190. }else{
  191. //Grantsaccesstosecurecontent.
  192. setupNavigation(R.string.setup_message_go_secured,
  193. R.string.setup_action_go_secured,
  194. newView.OnClickListener(){
  195. publicvoidonClick(Viewview){
  196. startActivity(newIntent(view.getContext(),SecureActivity.class));
  197. }
  198. });
  199. }
  200. }
  201. /**
  202. *监听器实现,这个小马不多讲了.
  203. */
  204. privateView.OnClickListenermActivateButtonListener=newView.OnClickListener(){
  205. @Override
  206. publicvoidonClick(Viewv){
  207. //First,persistthepolicy.Then,launchintenttotriggerthesystemscreen
  208. //requestingusertoconfirmtheactivationofthedeviceadministrator.
  209. writePolicy();
  210. IntentactivateDeviceAdminIntent=
  211. newIntent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
  212. activateDeviceAdminIntent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
  213. mPolicy.getPolicyAdmin());
  214. //Itisgoodpracticetoincludetheoptionalexplanationtexttoexplainto
  215. //userwhytheapplicationisrequestingtobeadeviceadministrator.Thesystem
  216. //willdisplaythismessageontheactivationscreen.
  217. activateDeviceAdminIntent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
  218. getResources().getString(R.string.device_admin_activation_message));
  219. startActivityForResult(activateDeviceAdminIntent,REQ_ACTIVATE_DEVICE_ADMIN);
  220. }
  221. };
  222. /**
  223. *监听器实现,这个小马也不多讲了.
  224. */
  225. privateView.OnClickListenermEnforcePolicyListener=newView.OnClickListener(){
  226. @Override
  227. publicvoidonClick(Viewv){
  228. writePolicy();
  229. //ThedeviceadministrationAPIdoesnot"fix"thepasswordifitis
  230. //determinedthatthecurrentpassworddoesnotconformtowhatisrequested
  231. //bythepolicy.Thecallerisresponsiblefortriggeringthepasswordsetup
  232. //screenviathebelowintent.
  233. Intentintent=newIntent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
  234. startActivity(intent);
  235. }
  236. };
  237. /**
  238. *设置激活按钮不同状态时的文本信息
  239. *@parammessageResId
  240. *@parambuttonTextResId
  241. *@paramlistener
  242. */
  243. privatevoidsetupNavigation(intmessageResId,intbuttonTextResId,
  244. View.OnClickListenerlistener){
  245. TextViewsetupMessage=(TextView)findViewById(R.id.setup_message);
  246. setupMessage.setText(messageResId);
  247. ButtonactionBtn=(Button)findViewById(R.id.setup_action_btn);
  248. actionBtn.setText(buttonTextResId);
  249. actionBtn.setOnClickListener(listener);
  250. }
  251. //在关闭此页时,将配置信息写入本地SP文件中.
  252. privatevoidwritePolicy(){
  253. intpasswordQuality=(int)mPasswordQualityInputField.getSelectedItemId();
  254. intpasswordLength=0;
  255. try{
  256. passwordLength=Integer.valueOf(mPasswordLengthInputField.getText().toString());
  257. }catch(NumberFormatExceptionnfe){}//Defaultsto0.
  258. intpasswordMinUppercase=0;
  259. try{
  260. passwordMinUppercase=
  261. Integer.valueOf(mPasswordMinUppercaseInputField.getText().toString());
  262. }catch(NumberFormatExceptionnfe){}//Defaultsto0.
  263. mPolicy.saveToLocal(passwordQuality,passwordLength,passwordMinUppercase);
  264. }
  265. }

配置操作类:

        
  1. packagecom.xiaoma.policymanager.demo;
  2. importandroid.app.Activity;
  3. importandroid.app.admin.DeviceAdminReceiver;
  4. importandroid.app.admin.DevicePolicyManager;
  5. importandroid.content.ComponentName;
  6. importandroid.content.Context;
  7. importandroid.content.Intent;
  8. importandroid.content.SharedPreferences;
  9. importandroid.os.Build;
  10. /**
  11. *@Title:Policy.java
  12. *@Packagecom.xiaoma.policymanager.demo
  13. *@Description:用来获取相关安全配置信息的类
  14. *@authorMZH
  15. */
  16. publicclassPolicy{
  17. publicstaticfinalintREQUEST_ADD_DEVICE_ADMIN=1;
  18. /**保存屏幕锁相关参数的SP文件名*/
  19. privatestaticfinalStringAPP_PREF="APP_PREF";
  20. /**下面三个是往SP中存储时的Key*/
  21. privatestaticfinalStringKEY_PASSWORD_LENGTH="PW_LENGTH";
  22. privatestaticfinalStringKEY_PASSWORD_QUALITY="PW_QUALITY";
  23. privatestaticfinalStringKEY_PASSWORD_MIN_UPPERCASE="PW_MIN_UPPERCASE";
  24. /**
  25. *下面是可允许输入密码的类型,此处的类型必须与string.xml文件中定义的arrays.xml中的相匹配
  26. */
  27. finalstaticint[]PASSWORD_QUALITY_VALUES=newint[]{
  28. DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED,
  29. DevicePolicyManager.PASSWORD_QUALITY_SOMETHING,
  30. DevicePolicyManager.PASSWORD_QUALITY_NUMERIC,
  31. DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC,
  32. DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC,
  33. DevicePolicyManager.PASSWORD_QUALITY_COMPLEX
  34. };
  35. privateintmPasswordQuality;
  36. privateintmPasswordLength;
  37. privateintmPasswordMinUpperCase;
  38. privateContextmContext;
  39. privateDevicePolicyManagermDPM;
  40. privateComponentNamemPolicyAdmin;
  41. /**
  42. *构造器,在new此类对象时,获取系统级管理员对象DevicePolicyManager
  43. *@paramcontext
  44. */
  45. publicPolicy(Contextcontext){
  46. mContext=context;
  47. mPasswordQuality=-1;
  48. mPasswordLength=0;
  49. mPasswordMinUpperCase=0;
  50. mDPM=(DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE);
  51. mPolicyAdmin=newComponentName(context,PolicyAdmin.class);
  52. }
  53. /**
  54. *保存设备参数
  55. */
  56. publicvoidsaveToLocal(intpasswordQuality,intpasswordLength,intpasswordMinUppercase){
  57. SharedPreferences.Editoreditor=
  58. mContext.getSharedPreferences(APP_PREF,Context.MODE_PRIVATE).edit();
  59. if(mPasswordQuality!=passwordQuality){
  60. editor.putInt(KEY_PASSWORD_QUALITY,passwordQuality);
  61. mPasswordQuality=passwordQuality;
  62. }
  63. if(mPasswordLength!=passwordLength){
  64. editor.putInt(KEY_PASSWORD_LENGTH,passwordLength);
  65. mPasswordLength=passwordLength;
  66. }
  67. if(mPasswordMinUpperCase!=passwordMinUppercase){
  68. editor.putInt(KEY_PASSWORD_MIN_UPPERCASE,passwordMinUppercase);
  69. mPasswordMinUpperCase=passwordMinUppercase;
  70. }
  71. editor.commit();
  72. }
  73. /**
  74. *从本地SP文件中获取密码配置参数
  75. */
  76. publicvoidreadFromLocal(){
  77. SharedPreferencesprefs=mContext.getSharedPreferences(APP_PREF,Context.MODE_PRIVATE);
  78. mPasswordQuality=prefs.getInt(KEY_PASSWORD_QUALITY,-1);
  79. mPasswordLength=prefs.getInt(KEY_PASSWORD_LENGTH,-1);
  80. mPasswordMinUpperCase=prefs.getInt(KEY_PASSWORD_MIN_UPPERCASE,-1);
  81. }
  82. /**
  83. *获取密码.
  84. *
  85. *@return
  86. */
  87. publicintgetPasswordQuality(){returnmPasswordQuality;}
  88. /**
  89. *获取密码长度.
  90. *
  91. *@return
  92. */
  93. publicintgetPasswordLength(){returnmPasswordLength;}
  94. /**
  95. *获取字母密码.
  96. *
  97. *@return
  98. */
  99. publicintgetPasswordMinUpperCase(){returnmPasswordMinUpperCase;}
  100. /**
  101. *获取设备管理的ComponentName对象.
  102. *
  103. *@return
  104. */
  105. publicComponentNamegetPolicyAdmin(){returnmPolicyAdmin;}
  106. /**
  107. *判断设备是否被激活.
  108. *
  109. *@return
  110. */
  111. publicbooleanisAdminActive(){
  112. returnmDPM.isAdminActive(mPolicyAdmin);
  113. }
  114. publicbooleanisActivePasswordSufficient(){
  115. returnmDPM.isActivePasswordSufficient();
  116. }
  117. /**
  118. *判断设备是否加安全
  119. *@return
  120. */
  121. publicbooleanisDeviceSecured(){
  122. returnisAdminActive()&&isActivePasswordSufficient();
  123. }
  124. /**
  125. *在声明的mDPM对象中进行配置.
  126. */
  127. publicvoidconfigurePolicy(){
  128. mDPM.setPasswordQuality(mPolicyAdmin,PASSWORD_QUALITY_VALUES[mPasswordQuality]);
  129. mDPM.setPasswordMinimumLength(mPolicyAdmin,mPasswordLength);
  130. if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
  131. mDPM.setPasswordMinimumUpperCase(mPolicyAdmin,mPasswordMinUpperCase);
  132. }
  133. }
  134. /**
  135. *下面这个类用来监听各种不同类型的设备管理事件,比如:改变密码..错误密码等等
  136. */
  137. publicstaticclassPolicyAdminextendsDeviceAdminReceiver{
  138. @Override
  139. publicvoidonDisabled(Contextcontext,Intentintent){
  140. //Calledwhentheappisabouttobedeactivatedasadeviceadministrator.
  141. super.onDisabled(context,intent);
  142. SharedPreferencesprefs=context.getSharedPreferences(APP_PREF,Activity.MODE_PRIVATE);
  143. /**清除以前在SP文件下保存的所有值*/
  144. prefs.edit().clear().commit();
  145. }
  146. }
  147. }

权限验证类:

        
  1. packagecom.xiaoma.policymanager.demo;
  2. importandroid.app.Activity;
  3. importandroid.content.Intent;
  4. /**
  5. *@Title:SecureActivity.java
  6. *@Packagecom.xiaoma.policymanager.demo
  7. *@Description:权限验证类实现
  8. *@authorMZH
  9. */
  10. publicclassSecureActivityextendsActivity{
  11. @Override
  12. protectedvoidonResume(){
  13. super.onResume();
  14. //Checktoseeifthedeviceisproperlysecuredasperthepolicy.Senduser
  15. //backtopolicysetupscreenifnecessary.
  16. Policypolicy=newPolicy(this);
  17. policy.readFromLocal();
  18. if(!policy.isDeviceSecured()){
  19. Intentintent=newIntent();
  20. intent.setClass(this,PolicySetupActivity.class);
  21. intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP|
  22. Intent.FLAG_ACTIVITY_CLEAR_TASK);
  23. startActivity(intent);
  24. finish();
  25. }
  26. setContentView(R.layout.activity_secure);
  27. }
  28. }

吼吼,效果就这样完成了,源码小马也放到附件里面了,如果有需要的朋友可以自行下载下的,有问题可直接留言,我们一起学习,一起进步,如有小马讲不好的地方,请朋友直接批评指点..小马定感谢...谢谢..加油加油!

更多相关文章

  1. 使用动画和fragment改善Android表单
  2. 加快AS的Gradle Build速度
  3. Android(安卓)获取本机号码(收集)
  4. 安全篇 - 隐式配置 KeyStore 签名信息
  5. Android(安卓)Studio之版本管理工具Git (图文教程)附连接到Git@OSC
  6. 【iOS-cocos2d-X 游戏开发之十六】配置你的Cocos2dx项目编译后的
  7. Android(安卓)GreenDao使用总结(包括模型生成、增删改查、修改存
  8. android 手动分包,将指定class打包到主dex中
  9. 【转发】Android(安卓)Metro风格的Launcher开发系列第一篇

随机推荐

  1. android 中spinner 三级联动
  2. Android 菜单资源
  3. Android 四种Http协议详解
  4. Android getResources().getColor() 过时
  5. Android之VideoView窗口/全屏播放
  6. Android上的ril库
  7. Android—文字轮播
  8. android GMS认证之testGoogleDuoPreloade
  9. Android - 插件使用整理 Android Styler
  10. android 代码混淆总结