Android屏幕锁定详解完整版(二)
16lz
2021-01-26
最近有朋友问屏幕锁定的问题,小马自己也在学习,网上找了下也没太详细的例子,看的资料书上也没有有关屏幕锁定程序的介绍,下个小决心,自己照着官方文档学习下,现在做好了,小马废话不多说,先发下截图,看下效果,需要注意的地方小马会加注释,有问题的朋友可以直接留言,我们共同学习交流,共同提高进步!直接看效果图:
一:未设置密码时进入系统设置的效果图如下:
二:运行DEMO,进入应用时:
三:设置密码方式预览:
四:只设置密码保护时的效果图
五:密码解密效果图
六:设置九宫格加密时的效果图
七:九宫格解密时的效果图
八:解密成功后,进入我们手机系统的图
下面来简单的看下源码吧,此处讲下,这个小DEMO也是小马临时学习下的,有讲的不明白的地方请朋友直接批评指出,有错肯定改的,吼吼..看代码:
主控制类:
- packagecom.xiaoma.policymanager.demo;
- importandroid.app.Activity;
- importandroid.app.admin.DevicePolicyManager;
- importandroid.content.Intent;
- importandroid.content.SharedPreferences;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.widget.AdapterView;
- importandroid.widget.ArrayAdapter;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- importandroid.widget.LinearLayout;
- importandroid.widget.Spinner;
- importandroid.widget.TextView;
- /**
- *@Title:PolicySetupActivity.java
- *@Packagecom.xiaoma.policymanager.demo
- *@Description:屏幕锁实现测试
- *@authorMZH
- */
- publicclassPolicySetupActivityextendsActivity{
- privatestaticfinalintREQ_ACTIVATE_DEVICE_ADMIN=10;
- privatestaticfinalStringSCREEN_ID_KEY="LAYOUT_ID";
- /**存储配置信息的SP文件名*/
- privatestaticfinalStringAPP_PREF="APP_PREF";
- /**有未知屏幕ID时返回此标识*/
- privatestaticfinalintUNKNOWN_SCREEN_ID=-1;
- /**声明组件*/
- privateSpinnermPasswordQualityInputField;
- privateEditTextmPasswordLengthInputField;
- privateEditTextmPasswordMinUppercaseInputField;
- /**获取配置操作类对象*/
- privatePolicymPolicy;
- /**当前屏幕ID*/
- privateintmCurrentScreenId;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- mPolicy=newPolicy(this);
- }
- @Override
- protectedvoidonResume(){
- super.onResume();
- /**获取本地SP文件中屏幕锁的配置信息*/
- SharedPreferencesprefs=getSharedPreferences(APP_PREF,MODE_PRIVATE);
- finalintsavedScreenId=prefs.getInt(SCREEN_ID_KEY,UNKNOWN_SCREEN_ID);
- /**如果获取到的ID为空,则跳转到设置页*/
- if(savedScreenId==UNKNOWN_SCREEN_ID||!mPolicy.isAdminActive()){
- setScreenContent(R.layout.activity_policy_setup);
- /**跳转到配置详情页*/
- }else{
- setScreenContent(savedScreenId);
- }
- }
- /**
- *设置屏幕方法实现,详细的可以自己看下,小马也是边参照官方文档,边学习的
- *有好想法..有问题的朋友们可以留言.我们一起学习
- *@paramscreenId
- */
- privatevoidsetScreenContent(finalintscreenId){
- /**记录当前屏幕ID,并预先存入本地SP配置文件中*/
- mCurrentScreenId=screenId;
- setContentView(mCurrentScreenId);
- getSharedPreferences(APP_PREF,MODE_PRIVATE).edit().putInt(
- SCREEN_ID_KEY,mCurrentScreenId).commit();
- switch(mCurrentScreenId){
- caseR.layout.activity_policy_setup:
- initPolicySetupScreen();
- initNavigation();
- break;
- caseR.layout.activity_view_policy:
- initViewPolicyScreen();
- initNavigation();
- break;
- }
- }
- /**
- *关闭页面时将当前配置写入本地SP文件中
- */
- @Override
- protectedvoidonPause(){
- super.onPause();
- if(mCurrentScreenId==R.layout.activity_policy_setup)writePolicy();
- }
- @Override
- protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
- if(requestCode==REQ_ACTIVATE_DEVICE_ADMIN&&resultCode==RESULT_OK){
- //Userjustactivatedtheapplicationasadeviceadministrator.
- setScreenContent(mCurrentScreenId);
- }else{
- super.onActivityResult(requestCode,resultCode,data);
- }
- }
- /**
- *重载返回键方法,如果已当前屏幕为已设置密码页,则展示详情
- */
- @Override
- publicvoidonBackPressed(){
- if(mCurrentScreenId==R.layout.activity_view_policy){
- setScreenContent(R.layout.activity_policy_setup);
- return;
- }
- super.onBackPressed();
- }
- /**
- *初始化化设置页
- */
- privatevoidinitPolicySetupScreen(){
- mPasswordQualityInputField=(Spinner)findViewById(R.id.policy_password_quality);
- mPasswordLengthInputField=(EditText)findViewById(R.id.policy_password_length);
- mPasswordMinUppercaseInputField=(EditText)findViewById(R.id.policy_password_uppercase);
- ArrayAdapter<CharSequence>adapter=ArrayAdapter.createFromResource(this,
- R.array.password_types,android.R.layout.simple_spinner_item);
- adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mPasswordQualityInputField.setAdapter(adapter);
- mPasswordQualityInputField.setOnItemSelectedListener(
- newAdapterView.OnItemSelectedListener(){
- publicvoidonItemSelected(AdapterView<?>parent,Viewview,intpos,longid){
- LinearLayoutpasswordMinUppercaseView=
- (LinearLayout)findViewById(R.id.password_uppercase_view);
- //Theminimumnumberofuppercasefieldisonlyapplicableforpassword
- //qualities:alpha,alphanumeric,orcomplex.
- if(pos>2)
- passwordMinUppercaseView.setVisibility(View.VISIBLE);
- else
- passwordMinUppercaseView.setVisibility(View.GONE);
- }
- publicvoidonNothingSelected(AdapterView<?>parent){}
- });
- /**阅读先前配置的相关信息*/
- mPolicy.readFromLocal();
- mPasswordQualityInputField.setSelection(mPolicy.getPasswordQuality());
- if(mPolicy.getPasswordLength()>0){
- mPasswordLengthInputField.setText(String.valueOf(mPolicy.getPasswordLength()));
- }else{
- mPasswordLengthInputField.setText("");
- }
- if(mPolicy.getPasswordMinUpperCase()>0){
- mPasswordMinUppercaseInputField.setText(
- String.valueOf(mPolicy.getPasswordMinUpperCase()));
- }else{
- mPasswordMinUppercaseInputField.setText("");
- }
- }
- /**
- *初始化查看详情页
- */
- privatevoidinitViewPolicyScreen(){
- TextViewpasswordQualityView=(TextView)findViewById(R.id.policy_password_quality);
- TextViewpasswordLengthView=(TextView)findViewById(R.id.policy_password_length);
- //ReadpreviouslysavedpolicyandpopulateontheUI.
- mPolicy.readFromLocal();
- intpasswordQualitySelection=mPolicy.getPasswordQuality();
- passwordQualityView.setText(
- getResources().getStringArray(R.array.password_types)[passwordQualitySelection]);
- passwordLengthView.setText(String.valueOf(mPolicy.getPasswordLength()));
- if(passwordQualitySelection>2){
- LinearLayoutpasswordMinUppercaseView=
- (LinearLayout)findViewById(R.id.password_uppercase_view);
- passwordMinUppercaseView.setVisibility(View.VISIBLE);
- ((TextView)findViewById(R.id.policy_password_uppercase)).setText(
- String.valueOf(mPolicy.getPasswordMinUpperCase()));
- }
- }
- /**
- *设置导航信息
- */
- privatevoidinitNavigation(){
- if(!mPolicy.isAdminActive()){
- //Activatesdeviceadministrator.
- setupNavigation(R.string.setup_message_activate,
- R.string.setup_action_activate,
- mActivateButtonListener);
- }elseif(mCurrentScreenId==R.layout.activity_policy_setup){
- setupNavigation(R.string.setup_message_set_policy,
- R.string.setup_action_set_policy,
- newView.OnClickListener(){
- publicvoidonClick(Viewview){
- writePolicy();
- mPolicy.configurePolicy();
- setScreenContent(R.layout.activity_view_policy);
- }
- });
- }
- elseif(!mPolicy.isActivePasswordSufficient()){
- //Launchespasswordset-upscreeninSettings.
- setupNavigation(R.string.setup_message_enforce_policy,
- R.string.setup_action_enforce_policy,
- mEnforcePolicyListener);
- }else{
- //Grantsaccesstosecurecontent.
- setupNavigation(R.string.setup_message_go_secured,
- R.string.setup_action_go_secured,
- newView.OnClickListener(){
- publicvoidonClick(Viewview){
- startActivity(newIntent(view.getContext(),SecureActivity.class));
- }
- });
- }
- }
- /**
- *监听器实现,这个小马不多讲了.
- */
- privateView.OnClickListenermActivateButtonListener=newView.OnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //First,persistthepolicy.Then,launchintenttotriggerthesystemscreen
- //requestingusertoconfirmtheactivationofthedeviceadministrator.
- writePolicy();
- IntentactivateDeviceAdminIntent=
- newIntent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
- activateDeviceAdminIntent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
- mPolicy.getPolicyAdmin());
- //Itisgoodpracticetoincludetheoptionalexplanationtexttoexplainto
- //userwhytheapplicationisrequestingtobeadeviceadministrator.Thesystem
- //willdisplaythismessageontheactivationscreen.
- activateDeviceAdminIntent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
- getResources().getString(R.string.device_admin_activation_message));
- startActivityForResult(activateDeviceAdminIntent,REQ_ACTIVATE_DEVICE_ADMIN);
- }
- };
- /**
- *监听器实现,这个小马也不多讲了.
- */
- privateView.OnClickListenermEnforcePolicyListener=newView.OnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- writePolicy();
- //ThedeviceadministrationAPIdoesnot"fix"thepasswordifitis
- //determinedthatthecurrentpassworddoesnotconformtowhatisrequested
- //bythepolicy.Thecallerisresponsiblefortriggeringthepasswordsetup
- //screenviathebelowintent.
- Intentintent=newIntent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
- startActivity(intent);
- }
- };
- /**
- *设置激活按钮不同状态时的文本信息
- *@parammessageResId
- *@parambuttonTextResId
- *@paramlistener
- */
- privatevoidsetupNavigation(intmessageResId,intbuttonTextResId,
- View.OnClickListenerlistener){
- TextViewsetupMessage=(TextView)findViewById(R.id.setup_message);
- setupMessage.setText(messageResId);
- ButtonactionBtn=(Button)findViewById(R.id.setup_action_btn);
- actionBtn.setText(buttonTextResId);
- actionBtn.setOnClickListener(listener);
- }
- //在关闭此页时,将配置信息写入本地SP文件中.
- privatevoidwritePolicy(){
- intpasswordQuality=(int)mPasswordQualityInputField.getSelectedItemId();
- intpasswordLength=0;
- try{
- passwordLength=Integer.valueOf(mPasswordLengthInputField.getText().toString());
- }catch(NumberFormatExceptionnfe){}//Defaultsto0.
- intpasswordMinUppercase=0;
- try{
- passwordMinUppercase=
- Integer.valueOf(mPasswordMinUppercaseInputField.getText().toString());
- }catch(NumberFormatExceptionnfe){}//Defaultsto0.
- mPolicy.saveToLocal(passwordQuality,passwordLength,passwordMinUppercase);
- }
- }
配置操作类:
- packagecom.xiaoma.policymanager.demo;
- importandroid.app.Activity;
- importandroid.app.admin.DeviceAdminReceiver;
- importandroid.app.admin.DevicePolicyManager;
- importandroid.content.ComponentName;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.content.SharedPreferences;
- importandroid.os.Build;
- /**
- *@Title:Policy.java
- *@Packagecom.xiaoma.policymanager.demo
- *@Description:用来获取相关安全配置信息的类
- *@authorMZH
- */
- publicclassPolicy{
- publicstaticfinalintREQUEST_ADD_DEVICE_ADMIN=1;
- /**保存屏幕锁相关参数的SP文件名*/
- privatestaticfinalStringAPP_PREF="APP_PREF";
- /**下面三个是往SP中存储时的Key*/
- privatestaticfinalStringKEY_PASSWORD_LENGTH="PW_LENGTH";
- privatestaticfinalStringKEY_PASSWORD_QUALITY="PW_QUALITY";
- privatestaticfinalStringKEY_PASSWORD_MIN_UPPERCASE="PW_MIN_UPPERCASE";
- /**
- *下面是可允许输入密码的类型,此处的类型必须与string.xml文件中定义的arrays.xml中的相匹配
- */
- finalstaticint[]PASSWORD_QUALITY_VALUES=newint[]{
- DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED,
- DevicePolicyManager.PASSWORD_QUALITY_SOMETHING,
- DevicePolicyManager.PASSWORD_QUALITY_NUMERIC,
- DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC,
- DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC,
- DevicePolicyManager.PASSWORD_QUALITY_COMPLEX
- };
- privateintmPasswordQuality;
- privateintmPasswordLength;
- privateintmPasswordMinUpperCase;
- privateContextmContext;
- privateDevicePolicyManagermDPM;
- privateComponentNamemPolicyAdmin;
- /**
- *构造器,在new此类对象时,获取系统级管理员对象DevicePolicyManager
- *@paramcontext
- */
- publicPolicy(Contextcontext){
- mContext=context;
- mPasswordQuality=-1;
- mPasswordLength=0;
- mPasswordMinUpperCase=0;
- mDPM=(DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE);
- mPolicyAdmin=newComponentName(context,PolicyAdmin.class);
- }
- /**
- *保存设备参数
- */
- publicvoidsaveToLocal(intpasswordQuality,intpasswordLength,intpasswordMinUppercase){
- SharedPreferences.Editoreditor=
- mContext.getSharedPreferences(APP_PREF,Context.MODE_PRIVATE).edit();
- if(mPasswordQuality!=passwordQuality){
- editor.putInt(KEY_PASSWORD_QUALITY,passwordQuality);
- mPasswordQuality=passwordQuality;
- }
- if(mPasswordLength!=passwordLength){
- editor.putInt(KEY_PASSWORD_LENGTH,passwordLength);
- mPasswordLength=passwordLength;
- }
- if(mPasswordMinUpperCase!=passwordMinUppercase){
- editor.putInt(KEY_PASSWORD_MIN_UPPERCASE,passwordMinUppercase);
- mPasswordMinUpperCase=passwordMinUppercase;
- }
- editor.commit();
- }
- /**
- *从本地SP文件中获取密码配置参数
- */
- publicvoidreadFromLocal(){
- SharedPreferencesprefs=mContext.getSharedPreferences(APP_PREF,Context.MODE_PRIVATE);
- mPasswordQuality=prefs.getInt(KEY_PASSWORD_QUALITY,-1);
- mPasswordLength=prefs.getInt(KEY_PASSWORD_LENGTH,-1);
- mPasswordMinUpperCase=prefs.getInt(KEY_PASSWORD_MIN_UPPERCASE,-1);
- }
- /**
- *获取密码.
- *
- *@return
- */
- publicintgetPasswordQuality(){returnmPasswordQuality;}
- /**
- *获取密码长度.
- *
- *@return
- */
- publicintgetPasswordLength(){returnmPasswordLength;}
- /**
- *获取字母密码.
- *
- *@return
- */
- publicintgetPasswordMinUpperCase(){returnmPasswordMinUpperCase;}
- /**
- *获取设备管理的ComponentName对象.
- *
- *@return
- */
- publicComponentNamegetPolicyAdmin(){returnmPolicyAdmin;}
- /**
- *判断设备是否被激活.
- *
- *@return
- */
- publicbooleanisAdminActive(){
- returnmDPM.isAdminActive(mPolicyAdmin);
- }
- publicbooleanisActivePasswordSufficient(){
- returnmDPM.isActivePasswordSufficient();
- }
- /**
- *判断设备是否加安全
- *@return
- */
- publicbooleanisDeviceSecured(){
- returnisAdminActive()&&isActivePasswordSufficient();
- }
- /**
- *在声明的mDPM对象中进行配置.
- */
- publicvoidconfigurePolicy(){
- mDPM.setPasswordQuality(mPolicyAdmin,PASSWORD_QUALITY_VALUES[mPasswordQuality]);
- mDPM.setPasswordMinimumLength(mPolicyAdmin,mPasswordLength);
- if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
- mDPM.setPasswordMinimumUpperCase(mPolicyAdmin,mPasswordMinUpperCase);
- }
- }
- /**
- *下面这个类用来监听各种不同类型的设备管理事件,比如:改变密码..错误密码等等
- */
- publicstaticclassPolicyAdminextendsDeviceAdminReceiver{
- @Override
- publicvoidonDisabled(Contextcontext,Intentintent){
- //Calledwhentheappisabouttobedeactivatedasadeviceadministrator.
- super.onDisabled(context,intent);
- SharedPreferencesprefs=context.getSharedPreferences(APP_PREF,Activity.MODE_PRIVATE);
- /**清除以前在SP文件下保存的所有值*/
- prefs.edit().clear().commit();
- }
- }
- }
权限验证类:
- packagecom.xiaoma.policymanager.demo;
- importandroid.app.Activity;
- importandroid.content.Intent;
- /**
- *@Title:SecureActivity.java
- *@Packagecom.xiaoma.policymanager.demo
- *@Description:权限验证类实现
- *@authorMZH
- */
- publicclassSecureActivityextendsActivity{
- @Override
- protectedvoidonResume(){
- super.onResume();
- //Checktoseeifthedeviceisproperlysecuredasperthepolicy.Senduser
- //backtopolicysetupscreenifnecessary.
- Policypolicy=newPolicy(this);
- policy.readFromLocal();
- if(!policy.isDeviceSecured()){
- Intentintent=newIntent();
- intent.setClass(this,PolicySetupActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP|
- Intent.FLAG_ACTIVITY_CLEAR_TASK);
- startActivity(intent);
- finish();
- }
- setContentView(R.layout.activity_secure);
- }
- }
吼吼,效果就这样完成了,源码小马也放到附件里面了,如果有需要的朋友可以自行下载下的,有问题可直接留言,我们一起学习,一起进步,如有小马讲不好的地方,请朋友直接批评指点..小马定感谢...谢谢..加油加油!
更多相关文章
- 使用动画和fragment改善Android表单
- 加快AS的Gradle Build速度
- Android(安卓)获取本机号码(收集)
- 安全篇 - 隐式配置 KeyStore 签名信息
- Android(安卓)Studio之版本管理工具Git (图文教程)附连接到Git@OSC
- 【iOS-cocos2d-X 游戏开发之十六】配置你的Cocos2dx项目编译后的
- Android(安卓)GreenDao使用总结(包括模型生成、增删改查、修改存
- android 手动分包,将指定class打包到主dex中
- 【转发】Android(安卓)Metro风格的Launcher开发系列第一篇