大佬教程收集整理的这篇文章主要介绍了Android实现屏幕锁定源码详解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
最近有朋友问屏幕锁定的问题,自己也在学习,网上找了下也没太详细的例子,看的资料书上也没有有关屏幕锁定程序的介绍,下个小决心,自己照着官方文档学习下,现在做好了,废话不多说,先发下截图,看下效果,需要注意的地方会加注释,有问题的朋友可以直接留言,我们共同学习交流,共同提高进步!直接看效果图:
一:未设置密码时进入系统设置的效果图如下:
二:设置密码方式预览:
三:密码解密效果图
四:九宫格解密时的效果图
下面来简单的看下源码吧,此处讲下,这个小DEMO也是临时学习下的,有讲的不明白的地方请朋友直接批评指出,有错肯定改的,吼吼看代码:
主控制类:
package com.xiaoma.policymanager.demo; import android.app.Activity; import android.app.admin.DevicePolicymanager; import android.content.Intent; import android.content.SharedPreferences; import android.os.bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; /** * @title: PolicySetupActivity.java * @Package com.xiaoma.policymanager.demo * @Description: 屏幕锁实现测试 * @author MZH */ public class PolicySetupActivity extends Activity { private static final int REQ_ACTIVATE_DEVICE_ADMIN = 10; private static final String SCREEN_ID_KEY = "LAYOUT_ID"; /**存储配置信息的SP文件名*/ private static final String APP_PREF = "APP_PREF"; /**有未知屏幕ID时返回此标识*/ private static final int UNKNowN_SCREEN_ID = -1; /**声明组件*/ private Spinner m@R_801_5747@dQualityInputField; private EditText m@R_801_5747@dLengthInputField; private EditText m@R_801_5747@dMinUppercaseInputField; /**获取配置操作类对象 */ private Policy mPolicy; /**当前屏幕ID*/ privatE int mCurrentScreenId; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPolicy = new Policy(this); } @Override protected void onResume() { super.onResume(); /**获取本地SP文件中屏幕锁的配置信息*/ SharedPreferences prefs = getSharedPreferences(APP_PREF, MODE_PRIVATE); final int savedScreenId = 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); } } /** * 设置屏幕方法实现,详细的可以自己看下,我也是边参照官方文档,边学习的 * 有好想法有问题的朋友们可以留言.我们一起学习 * @param screenId */ private void setScreenContent(final int screenId) { /**记录当前屏幕ID,并预先存入本地SP配置文件中*/ mCurrentScreenId = screenId; setContentView(mCurrentScreenId); getSharedPreferences(APP_PREF, MODE_PRIVATE).edit().puTint( SCREEN_ID_KEY, mCurrentScreenId).commit(); switch (mCurrentScreenId) { case R.layout.activity_policy_setup: initPolicySetupScreen(); initNavigation(); break; case R.layout.activity_view_policy: initViewPolicyScreen(); initNavigation(); break; } } /** * 关闭页面时将当前配置写入本地SP文件中 */ @Override protected void onPause() { super.onPause(); if (mCurrentScreenId == R.layout.activity_policy_setup) writePolicy(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQ_ACTIVATE_DEVICE_ADMIN && resultCode == RESULT_OK) { // User just activated the application as a device administrator. setScreenContent(mCurrentScreenId); } else { super.onActivityResult(requestCode, resultCode, data); } } /** * 重载返回键方法,如果已当前屏幕为已设置密码页,则展示详情 */ @Override public void onBACkPressed() { if (mCurrentScreenId == R.layout.activity_view_policy) { setScreenContent(R.layout.activity_policy_setup); return; } super.onBACkPressed(); } /** * 初始化化设置页 */ private void initPolicySetupScreen() { m@R_801_5747@dQualityInputField = (Spinner) findViewById(R.id.policy_password_quality); m@R_801_5747@dLengthInputField = (EditText) findViewById(R.id.policy_password_length); m@R_801_5747@dMinUppercaseInputField = (EditText) findViewById(R.id.policy_password_uppercase); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromresource(this, R.array.@R_801_5747@d_types, android.R.layout.simple_spinner_item); adapter.setDropDownViewresource(android.R.layout.simple_spinner_dropdown_item); m@R_801_5747@dQualityInputField.setAdapter(adapter); m@R_801_5747@dQualityInputField.setOnItemSELEctedListener( new AdapterView.onItemSELEctedListener() { public void onItemSELEcted(AdapterView<?> parent, View view, int pos, long id) { LinearLayout @R_801_5747@dMinUppercaseView = (LinearLayout) findViewById(R.id.@R_801_5747@d_uppercase_view); // The minimum number of upper case field is only applicable for @R_801_5747@d // qualities: alpha, alphanumeric, or complex. if (pos > 2) @R_801_5747@dMinUppercaseView.setVisibility(View.VISIBLE); else @R_801_5747@dMinUppercaseView.setVisibility(View.GONE); } public void onNothingSELEcted(AdapterView<?> parent) {} }); /**阅读先前配置的相关信息*/ mPolicy.readFromLocal(); m@R_801_5747@dQualityInputField.setSELEction(mPolicy.getpasswordQuality()); if (mPolicy.getpasswordLength() > 0) { m@R_801_5747@dLengthInputField.setText(String.valueOf(mPolicy.getpasswordLength())); } else { m@R_801_5747@dLengthInputField.setText(""); } if (mPolicy.getpasswordMinUpperCase() > 0) { m@R_801_5747@dMinUppercaseInputField.setText( String.valueOf(mPolicy.getpasswordMinUpperCase())); } else { m@R_801_5747@dMinUppercaseInputField.setText(""); } } /** * 初始化查看详情页 */ private void initViewPolicyScreen() { TextView @R_801_5747@dQualityView = (TextView) findViewById(R.id.policy_password_quality); TextView @R_801_5747@dLengthView = (TextView) findViewById(R.id.policy_password_length); // Read prevIoUsly saved policy and populate on the UI. mPolicy.readFromLocal(); int @R_801_5747@dQualitySELEction = mPolicy.getpasswordQuality(); @R_801_5747@dQualityView.setText( getresources().getStringArray(R.array.@R_801_5747@d_types)[@R_801_5747@dQualitySELEction]); @R_801_5747@dLengthView.setText(String.valueOf(mPolicy.getpasswordLength())); if (@R_801_5747@dQualitySELEction > 2) { LinearLayout @R_801_5747@dMinUppercaseView = (LinearLayout) findViewById(R.id.@R_801_5747@d_uppercase_view); @R_801_5747@dMinUppercaseView.setVisibility(View.VISIBLE); ((TextView) findViewById(R.id.policy_password_uppercase)).setText( String.valueOf(mPolicy.getpasswordMinUpperCase())); } } /** * 设置导航信息 */ private void initNavigation() { if (!mPolic y.isAdminActive()) { // Activates device administrator. setupNavigation(R.String.setup_message_activate, R.String.setup_action_activate, mActivateButtonListener); } else if (mCurrentScreenId == R.layout.activity_policy_setup) { setupNavigation(R.String.setup_message_set_policy, R.String.setup_action_set_policy, new View.onClickListener() { public void onClick(View view) { writePolicy(); mPolicy.configurePolicy(); setScreenContent(R.layout.activity_view_policy); } }); } else if (!mPolicy.isActive@R_801_5747@dSufficient()) { // Launches @R_801_5747@d set-up screen in SetTings. setupNavigation(R.String.setup_message_enforce_policy, R.String.setup_action_enforce_policy, mEnforcePolicyListener); } else { // Grants access to secure content. setupNavigation(R.String.setup_message_go_secured, R.String.setup_action_go_secured, new View.onClickListener() { public void onClick(View view) { startActivity(new Intent(view.getContext(), SecureActivity.class)); } }); } } /** * 监听器实现,这个不多讲了. */ private View.onClickListener mActivateButtonListener = new View.onClickListener() { @Override public void onClick(View v) { // First, persist the policy. Then, launch intent to trigger the system screen // requesTing user to confirm the activation of the device administrator. writePolicy(); Intent activateDeviceAdminIntent = new Intent(DevicePolicymanager.ACTION_ADD_DEVICE_ADMIN); activateDeviceAdminIntent.putExtra(DevicePolicymanager.EXTRA_DEVICE_ADMIN, mPolicy.getPolicyAdmin()); // it is good practice to include the optional explanation text to explain to // user why the application is requesTing to be a device administrator. The system // will display this message on the activation screen. activateDeviceAdminIntent.putExtra(DevicePolicymanager.EXTRA_ADD_EXPLANATION, getresources() .getString(R.String.device_admin_activation_message)); startActivityForResult(activateDeviceAdminIntent, REQ_ACTIVATE_DEVICE_ADMIN); } }; /** * 监听器实现,这个小马也不多讲了. */ private View.onClickListener mEnforcePolicyListener = new View.onClickListener() { @Override public void onClick(View v) { writePolicy(); // The device administration API does not "fix" the @R_801_5747@d if it is // determined that the current @R_801_5747@d does not conform to what is requested // by the policy. The caller is responsible for triggering the @R_801_5747@d set up // screen via the below intent. Intent intent = new Intent(DevicePolicymanager.ACTION_SET_NEW_password); startActivity(intent); } }; /** * 设置激活按钮不同状态时的文本信息 * @param messageResId * @param buttontextResId * @param listener */ private void setupNavigation(int messageResId, int buttontextResId, View.onClickListener listener) { TextView setupmessage = (TextView) findViewById(R.id.setup_message); setupmessage.setText(messageResId); Button actionBtn = (Button) findViewById(R.id.setup_action_btn); actionBtn.setText(buttontextResId); actionBtn.setOnClickListener(listener); } // 在关闭此页时,将配置信息写入本地SP文件中. private void writePolicy() { int @R_801_5747@dQuality = (int) m@R_801_5747@dQualityInputField.getSELEctedItemId(); int @R_801_5747@dLength = 0; try { @R_801_5747@dLength = Integer.valueOf(m@R_801_5747@dLengthInputField.getText().toString()); } catch (numberFormatException nfe) {} // Defaults to 0. int @R_801_5747@dMinUppercase = 0; try { @R_801_5747@dMinUppercase = Integer.valueOf(m@R_801_5747@dMinUppercaseInputField.getText().toString()); } catch (numberFormatException nfe) {} // Defaults to 0. mPolicy.saveToLocal(@R_801_5747@dQuality, @R_801_5747@dLength, @R_801_5747@dMinUppercase); } }
配置操作类:
package com.xiaoma.policymanager.demo; import android.app.Activity; import android.app.admin.DeviceAdminReceiver; import android.app.admin.DevicePolicymanager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.build; /** * @title: Policy.java * @Package com.xiaoma.policymanager.demo * @Description: 用来获取相关安全配置信息的类 * @author MZH */ public class Policy { public static final int requEST_ADD_DEVICE_ADMIN = 1; /**保存屏幕锁相关参数的SP文件名*/ private static final String APP_PREF = "APP_PREF"; /**下面三个是往SP中存储时的Key*/ private static final String KEY_password_LENGTH = "PW_LENGTH"; private static final String KEY_password_QUALITY = "PW_QUALITY"; private static final String KEY_password_MIN_UPPERCASE = "PW_MIN_UPPERCASE"; /** * 下面是可允许输入密码的类型,此处的类型必须与String.xml文件中定义的arrays.xml中的相匹配 */ final static int[] @R_801_5747@D_QUALITY_VALUES = new int[] { DevicePolicymanager.@R_801_5747@D_QUALITY_UNSPECIFIED, DevicePolicymanager.@R_801_5747@D_QUALITY_SOMETHING, DevicePolicymanager.@R_801_5747@D_QUALITY_NUMERIC, DevicePolicymanager.@R_801_5747@D_QUALITY_ALPHABETIC, DevicePolicymanager.@R_801_5747@D_QUALITY_ALPHANUMERIC, DevicePolicymanager.@R_801_5747@D_QUALITY_COMPLEX }; privatE int m@R_801_5747@dQuality; privatE int m@R_801_5747@dLength; privatE int m@R_801_5747@dMinUpperCase; private Context mContext; private DevicePolicymanager mDPM; private ComponentName mPolicyAdmin; /** * 构造器,在New此类对象时,获取系统级管理员对象 DevicePolicymanager * @param context */ public Policy(Context context) { mContext = context; m@R_801_5747@dQuality = -1; m@R_801_5747@dLength = 0; m@R_801_5747@dMinUpperCase = 0; mDPM = (DevicePolicymanager) context.getSystemservice(Context.DEVICE_POLICY_serviCE); mPolicyAdmin = new ComponentName(context, PolicyAdmin.class); } /** * 保存设备参数 */ public void saveToLocal(int @R_801_5747@dQuality, int @R_801_5747@dLength, int @R_801_5747@dMinUppercase) { SharedPreferences.Editor editor = mContext.getSharedPreferences(APP_PREF, Context.MODE_PRIVATE).edit(); if (m@R_801_5747@dQuality != @R_801_5747@dQuality) { editor.puTint(KEY_password_QUALITY, @R_801_5747@dQuality); m@R_801_5747@dQuality = @R_801_5747@dQuality; } if (m@R_801_5747@dLength != @R_801_5747@dLength) { editor.puTint(KEY_password_LENGTH, @R_801_5747@dLength); m@R_801_5747@dLength = @R_801_5747@dLength; } if (m@R_801_5747@dMinUpperCase != @R_801_5747@dMinUppercase) { editor.puTint(KEY_password_MIN_UPPERCASE, @R_801_5747@dMinUppercase); m@R_801_5747@dMinUpperCase = @R_801_5747@dMinUppercase; } editor.commit(); } /** * 从本地SP文件中获取密码配置参数 */ public void readFromLocal() { SharedPreferences prefs = mContext.getSharedPreferences(APP_PREF, Context.MODE_PRIVATE); m@R_801_5747@dQuality = prefs.geTint(KEY_password_QUALITY, -1); m@R_801_5747@dLength = prefs.geTint(KEY_password_LENGTH, -1); m@R_801_5747@dMinUpperCase = prefs.geTint(KEY_password_MIN_UPPERCASE, -1); } /** * 获取密码. * * @return */ public int getpasswordQuality() { return m@R_801_5747@dQuality; } /** * 获取密码长度. * * @return */ public int getpasswordLength() { return m@R_801_5747@dLength; } /** * 获取字母密码. * * @return */ public int getpasswordMinUpperCase() { return m@R_801_5747@dMinUpperCase; } /** * 获取设备管理的 ComponentName 对象. * * @return */ public ComponentName getPolicyAdmin() { return mPolicyAdmin; } /** * 判断设备是否被激活. * * @return */ public Boolean isAdminActive() { return mDPm.isAdminActive(mPolicyAdmin); } public Boolean isActive@R_801_5747@dSufficient() { return mDPm.isActive@R_801_5747@dSufficient(); } /** * 判断设备是否加安全 * @return */ public Boolean isDeviceSecured() { return isAdminActive() && isActiveP asswordSufficient(); } /** * 在声明的mDPM对象中进行配置. */ public void configurePolicy() { mDPm.set@R_801_5747@dQuality(mPolicyAdmin, @R_801_5747@D_QUALITY_VALUES[m@R_801_5747@dQuality]); mDPm.set@R_801_5747@dMinimumLength(mPolicyAdmin, m@R_801_5747@dLength); if (Build.VERSION.SDK_INT >= Build.VERSION_CODEs.HONEYCOMB) { mDPm.set@R_801_5747@dMinimumUpperCase(mPolicyAdmin, m@R_801_5747@dMinUpperCase); } } /** * 下面这个类用来监听各种不同类型的设备管理事件,比如:改变密码错误密码等等 */ public static class PolicyAdmin extends DeviceAdminReceiver { @Override public void onDisabled(Context context, Intent intent) { // Called when the app is about to be deactivated as a device administrator. super.onDisabled(context, intent); SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE); /**清除以前在SP文件下保存的所有值*/ prefs.edit().clear().commit(); } } }
权限验证类:
package com.xiaoma.policymanager.demo; import android.app.Activity; import android.content.Intent; /** * @title: SecureActivity.java * @Package com.xiaoma.policymanager.demo * @Description: 权限验证类实现 * @author MZH */ public class SecureActivity extends Activity { @Override protected void onResume() { super.onResume(); // check to see if the device is properly secured as per the policy. Send user // BACk to policy set up screen if necessary. Policy policy = new Policy(this); policy.readFromLocal(); if (!policy.isDeviceSecured()) { Intent intent = new Intent(); 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); } }
希望本文所述对你有所帮助,Android实现屏幕锁定源码详解内容就给大家介绍到这里了。希望大家继续关注我们的网站!想要学习Android可以继续关注本站。
以上是大佬教程为你收集整理的Android实现屏幕锁定源码详解全部内容,希望文章能够帮你解决Android实现屏幕锁定源码详解所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。