Android 添加屏幕锁和移除锁屏密码

需求:客户app控制锁屏和移除锁屏密码

MTK-8.1 Settings 中锁屏密码设置相关代码

1.锁屏图案保存核心代码
  • 源码:vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\password\ChooseLockPattern.java
public static class SaveAndFinishWorker extends SaveChosenLockWorkerBase {

        private List<LockPatternView.Cell> mChosenPattern;
        private String mCurrentPattern;
        private boolean mLockVirgin;

        public void start(LockPatternUtils utils, boolean credentialRequired,
                boolean hasChallenge, long challenge,
                List<LockPatternView.Cell> chosenPattern, String currentPattern, int userId) {
            prepare(utils, credentialRequired, hasChallenge, challenge, userId);

            mCurrentPattern = currentPattern;
            mChosenPattern = chosenPattern;
            mUserId = userId;

            mLockVirgin = !mUtils.isPatternEverChosen(mUserId);

            start();
        }
        
        @Override
        protected Intent saveAndVerifyInBackground() {
            Intent result = null;
            final int userId = mUserId;
            mUtils.saveLockPattern(mChosenPattern, mCurrentPattern, userId);
            // add for save Patternlock data
            String mSavedPattern = mUtils.patternToString(mChosenPattern);
            SystemProperties.set("persist.android.screen.lock", mSavedPattern);
            // end
            if (mHasChallenge) {
                byte[] token;
                try {
                    token = mUtils.verifyPattern(mChosenPattern, mChallenge, userId);
                } catch (RequestThrottledException e) {
                    token = null;
                }
                if (token == null) {
                    Log.e(TAG, "critical: no token returned for known good pattern");
                }

                result = new Intent();
                result.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
            }

            return result;
        }

保存的关键方法就是mUtils.saveLockPattern();
mChosenPattern 需保存的图案密码
mCurrentPattern 之前保存的图案密码,没有则为null
图案密码九宫格每个点 Cell 对应一个 Row, 一个 Column,实际规则如下

(0,0) (0,1) (0,2)

(1,0) (1,1) (1,2)

(2,0) (2,1) (2,2)

最终画线将每一个 cell 添加到集合中。
图案密码转String存储,LockPatternUtils中有提供方法

/**
     * Deserialize a pattern.
     * @param string The pattern serialized with {@link #patternToString}
     * @return The pattern.
     */
    public static List<LockPatternView.Cell> stringToPattern(String string) {
        if (string == null) {
            return null;
        }

        List<LockPatternView.Cell> result = Lists.newArrayList();

        final byte[] bytes = string.getBytes();
        for (int i = 0; i < bytes.length; i++) {
            byte b = (byte) (bytes[i] - '1');
            result.add(LockPatternView.Cell.of(b / 3, b % 3));
        }
        return result;
    }
    /**
     * Serialize a pattern.
     * @param pattern The pattern.
     * @return The pattern in string form.
     */
    public static String patternToString(List<LockPatternView.Cell> pattern) {
        if (pattern == null) {
            return "";
        }
        final int patternSize = pattern.size();

        byte[] res = new byte[patternSize];
        for (int i = 0; i < patternSize; i++) {
            LockPatternView.Cell cell = pattern.get(i);
            res[i] = (byte) (cell.getRow() * 3 + cell.getColumn() + '1');
        }
        return new String(res);
    }
2.PIN码和密码保存核心代码
  • 源码:vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\password\ChooseLockPassword.java
public static class SaveAndFinishWorker extends SaveChosenLockWorkerBase {

        private String mChosenPassword;
        private String mCurrentPassword;
        private int mRequestedQuality;

        public void start(LockPatternUtils utils, boolean required,
                boolean hasChallenge, long challenge,
                String chosenPassword, String currentPassword, int requestedQuality, int userId) {
            prepare(utils, required, hasChallenge, challenge, userId);

            mChosenPassword = chosenPassword;
            mCurrentPassword = currentPassword;
            mRequestedQuality = requestedQuality;
            mUserId = userId;

            start();
        }
         @Override
        protected Intent saveAndVerifyInBackground() {
            Intent result = null;
            mUtils.saveLockPassword(mChosenPassword, mCurrentPassword, mRequestedQuality,
                    mUserId);
            // add for save lock password
            SystemProperties.set("persist.android.screen.lock", mChosenPassword);
            // end

            if (mHasChallenge) {
                byte[] token;
                try {
                    token = mUtils.verifyPassword(mChosenPassword, mChallenge, mUserId);
                } catch (RequestThrottledException e) {
                    token = null;
                }

                if (token == null) {
                    Log.e(TAG, "critical: no token returned for known good password.");
                }
                result = new Intent();
                result.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
            }

            return result;
        }
    }

保存的关键方法mUtils.saveLockPassword()
mChosenPassword 要保存的密码
mCurrentPassword 之前保存过的密码,没有则为null

3.移除密码核心代码
  • 源码:vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\password\ChooseLockGeneric.java
 void updateUnlockMethodAndFinish(int quality, boolean disabled, boolean chooseLockSkipped) {
            // Sanity check. We should never get here without confirming user's existing password.
            if (!mPasswordConfirmed) {
                throw new IllegalStateException("Tried to update password without confirming it");
            }
            ...
            
            if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
                mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, true, mUserPassword);
                mChooseLockSettingsHelper.utils().clearLock(mUserPassword, mUserId);
                mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled, mUserId);
                getActivity().setResult(Activity.RESULT_OK);
                removeAllFingerprintForUserAndFinish(mUserId);
            } else {
                removeAllFingerprintForUserAndFinish(mUserId);
            }
        }

清除密码
clearLock(mUserPassword, mUserId);
禁用显示屏幕锁定(只有在没有设置pin/密码/图案下才有意义),设置为true没有任何锁屏显示
setLockScreenDisabled(disabled, mUserId);

4.创建锁屏密码,清除锁屏密码
package com.android.screenlock;

import android.content.Context;
import android.util.Log;
import android.os.AsyncTask;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.PowerManager;
import android.os.SystemClock;

import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternView;
import com.android.internal.widget.LockPatternView.Cell;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import android.app.admin.DevicePolicyManager;

public class ScreenLockHelper{

	private static final String TAG = "ScreenLockHelper";

	private final String KEY = "persist.android.screen.lock";

	private Context mContext;
    private PowerManager mPowerManager;

	private LockPatternUtils mLockPatternUtils;
    private int mRequestedQuality = DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; 

	public ScreenLockHelper(Context context) {
        mContext = context;
        mLockPatternUtils = new LockPatternUtils(context);
        mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
    }
    
    public void createAndSavePasswordLock(String password){
        new Task().execute(password);
    }

    public void clearScreenLock() {
        String pwdValue = SystemProperties.get(KEY, "");
        mLockPatternUtils.clearLock(pwdValue, 0);
     //   mLockPatternUtils.setLockScreenDisabled(true, 0); 
        savedPassword("");
    }

    private void savedPassword(String pwd){
        SystemProperties.set(KEY, pwd);
    }
    
    private class Task extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params){
            String password = params[0];
            clearScreenLock();
            mLockPatternUtils.saveLockPassword(password, null, 
                mRequestedQuality, 0);
            return password;
        }

        @Override
        protected void onPostExecute(String s) {
            savedPassword(s);
            mPowerManager.goToSleep(SystemClock.uptimeMillis());
        }
    }
    
//LOCAL_JAVA_LIBRARIES := framework
//LOCAL_PRIVATE_PLATFORM_APIS := true

然后编写aidl,提供给客户使用

参考:https://blog.csdn.net/u012932409/article/details/120916705

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值