Android手机如何判断有没有锁屏密码
来源:互联网 发布:淘宝窗帘拍摄价格 编辑:程序博客网 时间:2024/04/28 02:24
Android手机如何判断有没有锁屏密码
今天来到新公司接收到的第一个任务就是这个,调研有没有方式判断Android手机有没有锁屏密码,最初的想法是自己以前写过一下程序锁的实现原理,去监听历史任务栈,看第一个程序是不是就是程序锁,结果失败告终,问了一个以前的朋友,了解到keyguard这个类,Google一下,看Keyguard解锁屏机制这个介绍的比较详细。大概了解了锁屏的原理。不多说了,直接进入正题
Google有几种默认的锁屏方式
public static final int PASSWORD_QUALITY_ALPHABETIC = 262144;//字母密码 public static final int PASSWORD_QUALITY_ALPHANUMERIC = 327680;//字母数字密码 public static final int PASSWORD_QUALITY_BIOMETRIC_WEAK = 32768; public static final int PASSWORD_QUALITY_COMPLEX = 393216;//复杂密码,我没有测试到 public static final int PASSWORD_QUALITY_NUMERIC = 131072;//数字密码 public static final int PASSWORD_QUALITY_NUMERIC_COMPLEX = 196608; //复杂数字密码 public static final int PASSWORD_QUALITY_SOMETHING = 65536;//图案密码 public static final int PASSWORD_QUALITY_UNSPECIFIED = 0;//无密码
下面问题来了,如何获取这些状态呢,通过看KeyGuard类,了解到,这个类里面判断模式的都是通过LockPatternUtils
类去获取锁屏时的密码模式的,该类是在 frameworks 层的,Android内置的,无法直接访问。
找了一下资料,在stackoverflow上看到一个如下写的代码:
boolean isLock = android.provider.Settings.System.getInt( getContentResolver(), Settings.System.LOCK_PATTERN_ENABLED, 0) == 1;
判断isLock真假来判断如否有屏幕锁,该方法经过测试,在无密码的状态是可以,在图案密码的情况下也是可以的,但是在数字密码的情况下不行,此方式行不通。还是换回第一种思路
在googlesources上查看LockPatternUtils代码
看到有好几个获取锁屏模式的方法:
getActivePasswordQuality():
/** * Used by device policy manager to validate the current password * information it has. */ public int getActivePasswordQuality() { int activePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; // Note we don't want to use getKeyguardStoredPasswordQuality() because we want this to // return biometric_weak if that is being used instead of the backup int quality = (int) getLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING); switch (quality) { case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: if (isLockPatternEnabled()) { activePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; } break; case DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK: if (isBiometricWeakInstalled()) { activePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK; } break; case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: if (isLockPasswordEnabled()) { activePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; } break; case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: if (isLockPasswordEnabled()) { activePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC; } break; case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC: if (isLockPasswordEnabled()) { activePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC; } break; case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX: if (isLockPasswordEnabled()) { activePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; } break; } return activePasswordQuality; }
getKeyguardStoredPasswordQuality():
/** * Retrieves the quality mode we're in. * {@see DevicePolicyManager#getPasswordQuality(android.content.ComponentName)} * * @return stored password quality */ public int getKeyguardStoredPasswordQuality() { int quality = (int) getLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING); // If the user has chosen to use weak biometric sensor, then return the backup locking // method and treat biometric as a special case. if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) { quality = (int) getLong(PASSWORD_TYPE_ALTERNATE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING); } return quality; }
看注释,getKeyguardStoredPasswordQuality不建议使用,于是反射LockPatternUtils调用getActivePasswordQuality方法获取锁屏模式
代码如下:
private boolean isPhoneHasLock() { String LOCKSCREEN_UTILS = "com.android.internal.widget.LockPatternUtils"; try { Class<?> lockUtilsClass = Class.forName(LOCKSCREEN_UTILS); Object lockUtils = lockUtilsClass.getConstructor(Context.class).newInstance(this); try { Method method = lockUtilsClass.getMethod("getActivePasswordQuality"); Integer mode = (Integer) method.invoke(lockUtils); if (mode == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { return false; } else { return true; } } catch (Exception e) { } catch (Exception e) { Log.e("reflectInternalUtils", "ex:" + e); } return false; }
通过该方法就可以判断Android手机是否有解屏密码了。
* 注意,该方法需要在屏幕点亮的广播中调用,才能及时判断用户是否有解屏密码。*
顺带把注册屏幕开关的代码也附上,以后查找方便
IntentFilter mScreenOnFilter = new IntentFilter("android.intent.action.SCREEN_ON"); this.registerReceiver(mScreenOReceiver, mScreenOnFilter); private BroadcastReceiver mScreenOReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals("android.intent.action.SCREEN_ON")) { isPhoneHasLock(); } } };
第一次用markdown写blog,写完啦。仅供同行学习,欢迎指导!
- Android手机如何判断有没有锁屏密码
- android 如何判断有没有网络
- android判断手机有没有安装微博
- 判断屏幕有没有设置解锁密码
- Android忘记锁屏密码如何进入手机?
- Android 手机锁屏下点亮屏幕并解锁(没有锁屏密码的情况下)
- JS如何判断有没有上一页?
- 如何判断手机浏览器是否有安全隐患?
- android判断有没有网络连接
- 判断Android手机是否有录音权限
- Android 判断手机是否有传感器
- 判断有没有网
- 判断有没有网络
- 如何判断网站有没有SSL证书保护?
- 如何判断文件有没有读取到尾部
- 如何判断Android手机当前是否联网?
- 如何判断Android手机当前是否联网?
- 如何判断Android手机当前是否联网?
- 随机获取Mysql数据表的一条或多条记录
- android gridview onItemClick参数说明
- java之类型转换与接口
- 比特币——区块链
- matlab 箭头的样式问题
- Android手机如何判断有没有锁屏密码
- 通过反射修改数组大小
- 七天学会ASP.NET MVC (四)——用户授权认证问题
- ReactiveCocoa学习
- window 下创建两个mysql数据库实例
- GridView利用HorizontalScrollView横滚
- 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理
- AJAX教程系列六:ajax无刷新上传
- Spark tungsten shuffle