需求:客户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