Android手机上设置非英语语言的密码?

问题描述:

参照this在Android栈的问题,我有一个解决方案,做到这使得Android手机为制定非英语语言密码的支持。

With Reference to this question on android stack, i have a solution to do which allows android phone to provide support for setting non-english language password.

我的手机SRC是基于这不是让我设定的密码是使用非ASCII标准,如希伯来语股票机器人。

My phones SRC is based on stock-android which is not allowing me to set password which is non-ascii standards like Hebrew.

从AOSP源$ C ​​$ C处理的密码输入锁屏基础, ChooseLockPassword.java ,里面validatePassword()(第292行),这里是一个片段,将显示非法字符的消息(从行311):

Based from AOSP source code that handles the password input for lock screen, ChooseLockPassword.java, inside validatePassword() (line 292), here is a snippet that will show the "illegal character" message (from line 311):

// allow non control Latin-1 characters only
if (c < 32 || c > 127) {
    return getString(R.string.lockpassword_illegal_character);
}

我注释掉这一部分,但我不这么认为这会工作。 [等待闪过]
有这个条件没有这样的问题,我需要破解的可能性这样做的任何解决也将做帮助。

I have commented out this part but i don't think so this will work. [Waiting to be Flashed] There are no such question for this condition, i need help for cracking the possibility for doing this any "Work around" will also do.

所以战斗几天后,我通过实现我的方法,它得到了一个解决办法。

So after fighting few days i got a workaround by implementing my method for it.

private String validateHebrewPassword(String password)
        {
                if (password.length() < mPasswordMinLength) {
                        return getString(mIsAlphaMode ?
                                        R.string.lockpassword_password_too_short
                                        : R.string.lockpassword_pin_too_short, mPasswordMinLength);
                }
                if (password.length() > mPasswordMaxLength) {
                        return getString(mIsAlphaMode ?
                                        R.string.lockpassword_password_too_long
                                        : R.string.lockpassword_pin_too_long, mPasswordMaxLength + 1);
                }

            for (int i = 0; i < password.length(); i++)
            {
                char c = password.charAt(i);
                        System.out.println("Validate Hebrew Password Success "+ " Char "+c+" for password "+password+ " langauage "+locale);

            }
            return null;
        }

和modiying其validatePasswor()来电具体有点像希伯来文:

And modiying its validatePasswor() caller a bit specific to hebrew like:

    private void handleNext() {
                final String pin = mPasswordEntry.getText().toString();
                if (TextUtils.isEmpty(pin)) {
                    return;
                }
                String errorMsg = null;
                if (mUiStage == Stage.Introduction) 
                {
                    String locale = java.util.Locale.getDefault().getLanguage();
                    if(locale.equals("iw")) //Specific Hebrew check
                    { 
                        errorMsg = validateHebrewPassword(pin); //New Method
                    }
                    else
                    {
                        errorMsg = validatePassword(pin); //AOSP Method
                    }
                    if (errorMsg == null) 
                    {
                        mFirstPin = pin;
                        mPasswordEntry.setText("");
                        updateStage(Stage.NeedToConfirm);
                    }
                } else if (mUiStage == Stage.NeedToConfirm) {
                    if (mFirstPin.equals(pin)) {
                        final boolean isFallback = getActivity().getIntent().getBooleanExtra(
                                LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
                        mLockPatternUtils.clearLock(isFallback);
                        mLockPatternUtils.saveLockPassword(pin, mRequestedQuality, isFallback);
                        getActivity().setResult(RESULT_FINISHED);
                        getActivity().finish();
                    } else {
                        CharSequence tmp = mPasswordEntry.getText();
                        if (tmp != null) {
                            Selection.setSelection((Spannable) tmp, 0, tmp.length());
                        }
                        updateStage(Stage.ConfirmWrong);
                    }
                }
                if (errorMsg != null) {
                    showError(errorMsg, mUiStage);
                }
            }

private void updateUi() {
            String password = mPasswordEntry.getText().toString();
            final int length = password.length();
            if (mUiStage == Stage.Introduction && length > 0) {
                if (length < mPasswordMinLength) {
                    String msg = getString(mIsAlphaMode ? R.string.lockpassword_password_too_short
                            : R.string.lockpassword_pin_too_short, mPasswordMinLength);
                    mHeaderText.setText(msg);
                    mNextButton.setEnabled(false);
                } else 
                {
                    String locale = java.util.Locale.getDefault().getLanguage();
                    String error = null;
                    if(locale.equals("iw")) //Specific Hebrew check
                    { 
                        error = validateHebrewPassword(password); //New method
                    }
                    else
                    {
                        error = validatePassword(password); //AOSP Method
                    }
                    if (error != null) {
                        mHeaderText.setText(error);
                        mNextButton.setEnabled(false);
                    } else {
                        mHeaderText.setText(R.string.lockpassword_press_continue);
                        mNextButton.setEnabled(true);
                    }
                }
            } else {
                mHeaderText.setText(mIsAlphaMode ? mUiStage.alphaHint : mUiStage.numericHint);
                mNextButton.setEnabled(length > 0);
            }
            mNextButton.setText(mUiStage.buttonText);
        }