• 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

  • 相关阅读:
    LidarView工程搭建指南
    39.JS插件
    小程序获取用户手机号码
    图像分块及拼接(二)python代码
    java计算机毕业设计社区二手交易平台前台源码+系统+数据库+lw文档+mybatis+运行部署
    SuperMap iClient3D for WebGL Canvas(一)数字流特效
    神经网络NLP基础 循环神经网络 LSTM
    redis持久化之AOF(Append Only File)
    Object Detection in Optical Remote Sensing Images: A Survey and A New Benchmark
    虚拟化/超融合人才招聘和业务合作
  • 原文地址:https://blog.csdn.net/wxd_csdn_2016/article/details/127103979