AndroidQ 获取、设置锁屏密码

AndroidQ 获取、设置锁屏密码

本文中贴出的源码均为AndroidQ(9.0)源码,如果想要使用需要引入Framework的jar包

LockPatternUtils

说到密码相关的一定要提到LockPatternUtils这个类,它是Android系统中管理锁屏密码的工具类,其中:

设置密码:

class LockPatternUtils{
    /**
     * 修改密码
     *
     * @param password 原密码,没有设置密码时为null
     * @param savedPassword 新密码
     * @param requestedQuality 密码的类型和限制     
     * DevicePolicyManager.PASSWORD_QUALITY_SOMETHING://图案
     * DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX://PIN码
     * DevicePolicyManager.PASSWORD_QUALITY_COMPLEX://密码
     * @param userHandle 当前的UserID.
     *
     */
public void saveLockPassword(String password, String savedPassword, int requestedQuality, int userHandle);
}

实例:

    /**
     * @param password 原密码,没有设置密码时为null
     * @param savedPassword 新密码
     *
     */
    private void saveLockPassword(String password, String mUserPassword) {
        try {
          LockPatternUtils lockPatternUtils = new LockPatternUtils(this);
          int userId = ActivityManager.getService().getCurrentUser().id;
          lockPatternUtils.saveLockPassword(password, mUserPassword, DevicePolicyManager.PASSWORD_QUALITY_COMPLEX, userId);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

关于如何获取原密码,我闹了一个笑话,在发现源码里面的原密码是在几个画面之间用Bundle存起来互相传递的,可是我没有找到系统是以哪一个方法去获取到系统密码的,以正常的逻辑来看,获取原密码的方法也是应该属于LockPatternUtils这个类,但是我就是找不到,又在画面之间传递的Bundle绕晕了,脸怼屏幕看源码卡了我一天。

后面各种查询,才发现Android6.0之后因为安全问题,已经删除了查询到密码的方法…那系统是怎么拿到原密码的呢?

答案其实很简单,进入密码设置画面之前系统会进行密码验证,LockPatternChecker类中提供了验证密码的方法checkPassword,当验证成功时,输入框里的内容就是原密码,再把原密码传递到下一个画面。当时我进入了系统一定有提供获取密码的方法这个怪圈,现在想想真的是好笑,哈哈。

验证密码的方法:LockPatternChecker.checkPassword

    public static AsyncTask<?, ?, ?> checkPassword(final LockPatternUtils utils, final String password, final int userId, final LockPatternChecker.OnCheckCallback callback) {
        AsyncTask<Void, Void, Boolean> task = new AsyncTask<Void, Void, Boolean>() {
            private int mThrottleTimeout;

            protected Boolean doInBackground(Void... args) {
                try {
                    LockPatternUtils var10000 = utils;
                    String var10001 = password;
                    int var10002 = userId;
                    LockPatternChecker.OnCheckCallback var10003 = callback;
                    Objects.requireNonNull(var10003);
                    return var10000.checkPassword(var10001, var10002, var10003::onEarlyMatched);
                } catch (RequestThrottledException var3) {
                    this.mThrottleTimeout = var3.getTimeoutMs();
                    return false;
                }
            }

            protected void onPostExecute(Boolean result) {
                callback.onChecked(result, this.mThrottleTimeout);
            }

            protected void onCancelled() {
                callback.onCancelled();
            }
        };
        task.execute(new Void[0]);
        return task;
    }

使用:

    private void checkPassword(String password,LockPatternChecker.OnCheckCallback checkCallback ) {
        LockPatternChecker.checkPassword(lockPatternUtils, password, userId, checkCallback);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值