2011-05-02 19 views
8

Necesito cifrar mi contraseña antes de guardarla en la base de datos local de Android. Todo funciona bien sin cifrado, tengo preferences.xml y eso. ¿Cómo puedo llamar a una función después de Cambiar el valor de preferencia (por ejemplo, contraseña)? Aquí está mi código:¿Procesar el valor de preferencia antes de guardar en Android?

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: Así, cuando cambio de contraseña, se almacena la contraseña sin cifrar.

Respuesta

16

me hicieron esto mediante la extensión de la EditTextPreference base y cifrar/descifrar la contraseña allí:

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)); 
    } 
} 

Hay algunas llamadas a mis utilidades personales, pero creo que el código es bastante claro en lo que tiene que hacer .

+0

Gracias por la idea, hice mi propia clase de extensión pero ¿cómo la implemento en mi pantalla de preferencias? Con una entrada en un archivo XML? Intenté de esta manera pero no tuve éxito. – EvanBlack

+3

Tiene que ser el nombre completo, por ej. dmon

+0

Gracias, eso funciona como magia. :) – EvanBlack

Cuestiones relacionadas