2011-05-02 12 views
8

Ho bisogno di criptare la mia password prima di salvarla nel database Android locale. Tutto funziona bene senza crittografia, ho preferenze.xml e così via. Come posso chiamare una funzione dopo Modificare il valore di preferenza (ad esempio, password)? Qui è il mio codice:Elabora il valore della preferenza prima di salvare in 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: Come questo, quando cambio della password, memorizza la password senza crittografia.

risposta

16

ho fatto estendendo l'EditTextPreference base e cifrare/decifrare la password c'è:

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

ci sono alcune chiamate ai miei programmi di utilità personale, ma penso che il codice è abbastanza chiaro in che cosa dovete fare .

+0

Grazie per l'idea, ho creato la mia classe di estensione ma come posso implementarla nella schermata delle mie preferenze? Con una voce nel file XML? Ho provato in questo modo ma nessun successo. – EvanBlack

+3

Deve essere il nome completo, ad es. dmon

+0

Grazie, funziona come per magia. :) – EvanBlack

Problemi correlati