Android进入屏幕解锁方式选择引导界面点击no的时候依旧需要

2020-04-01  本文已影响0人  梧叶已秋声

由于选择的是PIN码解锁,这里对应的文件是EncryptionInterstitial。

首先,在EncryptionInterstitial中将startLockIntent屏蔽掉,转而调用finish,并且新增一个REQUEST,使用setResult传递出去。修改后如下所示。

//vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\EncryptionInterstitial.java
public class EncryptionInterstitial extends SettingsActivity {
.....
    private static final int DISABLE_ENCRYPTION_REQUEST = 105;
.....
      @Override
        public void onClick(View view) {
            if (view == mRequirePasswordToDecrypt) {
                final boolean accEn = AccessibilityManager.getInstance(getActivity()).isEnabled();
                if (accEn && !mPasswordRequired) {
                    setRequirePasswordState(false); // clear the UI state
                    AccessibilityWarningDialogFragment.newInstance(mRequestedPasswordQuality)
                            .show(
                                    getChildFragmentManager(),
                                    AccessibilityWarningDialogFragment.TAG);
                } else {
                    setRequirePasswordState(true);
                    startLockIntent();
                }
            } else {
                setRequirePasswordState(false);
                getActivity().setResult(DISABLE_ENCRYPTION_REQUEST);
                finish();
                //startLockIntent();
            }
        }
}

然后,在ChooseLockGeneric的onActivityResult中处理EncryptionInterstitial 传递的REQUEST。具体修改如下所示。

//vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\password\ChooseLockGeneric.java
public class ChooseLockGeneric extends SettingsActivity {
    .....
    private static final int DISABLE_ENCRYPTION_REQUEST = 105;
    .....
   @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            mWaitingForConfirmation = false;
            if (resultCode == DISABLE_ENCRYPTION_REQUEST){
                mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, true, mUserPassword);
                mChooseLockSettingsHelper.utils().clearLock(mUserPassword, mUserId);
                mChooseLockSettingsHelper.utils().setLockScreenDisabled(true, mUserId);
            }else if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
             .....
        }
      .....
}

      .....
  void updateUnlockMethodAndFinish(int quality, boolean disabled, boolean chooseLockSkipped) {
     .....
      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);
            }
 .....
}
.....

清除密码是参考quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED的代码去写的。因为这个对应SecurityMode.None。
我尝试过EncryptionInterstitial中跳过调用startLockIntent,选择no的时候调用finish,结果导致重启后,无法进去桌面,因此ChooseLockGeneric中清除密码部分是必需的。

参考链接:
基于android7.1.1锁屏模块分析
Android Keyguard(三) 锁屏设置

上一篇下一篇

猜你喜欢

热点阅读