【问题标题】:Process the value of preference before save in Android?在Android中保存之前处理首选项的值?
【发布时间】:2011-08-17 01:23:57
【问题描述】:

我需要先加密我的密码,然后才能将其保存到本地 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();
            });
    }
}

P.S:像这样,当我更改密码时,它会存储密码而不加密。

【问题讨论】:

    标签: android encryption passwords preferences


    【解决方案1】:

    我通过扩展基本的 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 文件中有 条目?我试过这种方法,但没有成功。
    • 它必须是完全限定的名称,例如
    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 2010-10-06
    • 2012-03-29
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多