在Android中保存偏好设置之前处理其值?

8

在将密码保存到本地Android数据库之前,我需要对其进行加密。如果不加密,一切都正常,我有preferences.xml等。当我更改首选项的值(例如密码)后,如何调用一个函数?以下是我的代码:

public class Preferences extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);

            // Get the custom preference
            Preference customPref = (Preference) findPreference("pass");

            customPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                String crypto = SimpleCrypto.encrypt("MYSECRETKEY", newValue.toString()); // encrypt
                // Here is where I'm wrong, I guess.
                SharedPreferences settings = getSharedPreferences("preferences", MODE_PRIVATE);
                SharedPreferences.Editor editor = settings.edit();
                editor.putString("pass", crypto);
                editor.commit();
            });
    }
}

提示:就像这样,当我更改密码时,它会以未加密的形式存储密码。

1个回答

17

我通过扩展基本的EditTextPreference并在那里加密/解密密码来实现这一点:

public class EncryptedEditTextPreference extends EditTextPreference {
  public EncryptedEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  public EncryptedEditTextPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public EncryptedEditTextPreference(Context context) {
    super(context);
  }

  @Override
  public String getText() {
    String value = super.getText();
    return SecurityUtils.decrypt(value);
  }

  @Override
  protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
    super.setText(restoreValue ? getPersistedString(null) : (String) defaultValue);
  }

  @Override
  public void setText(String text) {
    if (Utils.isStringBlank(text)) {
      super.setText(null);
      return;
    }
    super.setText(SecurityUtils.encrypt(text));
  }
}

我的个人工具库中有一些调用,但我认为代码已经相当清晰了,告诉你该怎么做。


谢谢你的建议,我已经制作了自己的扩展类,但是如何将它实现到我的首选项屏幕中呢?需要在XML文件中添加一个<EncryptedEditTextPreference />条目吗?我尝试过这种方式,但没有成功。 - EvanBlack
3
必须是完全限定名称,例如 <com.yourpackage.yourapp.EncryptedEditTextpreference />。 - dmon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接