расширение базового EditTextPreference и шифрование / дешифрование - PullRequest
2 голосов
/ 13 марта 2012

Благодаря dmon и приведенному здесь примеру Обрабатывать значение предпочтения перед сохранением в Android?

Мне удалось получить базовый код.Но мое значение не хранится в устройстве в зашифрованном виде в файле Preferences.xml, и я знаю, что это простая ошибка с моей стороны (java новичок).

Мой класс шифрования и дешифрования работает за пределами кода EditTextPreference.

С уважением,

Майк

Мои предпочтения.xml

    <ping.test.com.EncryptedEditTextpreference 
        android:key="key" 
        android:summary="Enter Your Public Key" 
        android:title="Public Key" 
        android:inputType="textPassword"/>

</PreferenceCategory>

Мой класс для расширения EditTextPreference

package ping.test.com;

import android.content.Context;
import android.preference.EditTextPreference;
import android.util.AttributeSet;

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();
    try {
        return SimpleCrypto.decrypt("BiteMe", value);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return value;
  }

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

  @Override
  public void setText(String text) {

        try {
            super.setText(SimpleCrypto.encrypt("BiteMe", text ));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

  }
}

Ответы [ 2 ]

0 голосов
/ 27 апреля 2016

не показывает зашифрованное значение при отображении настроек, так как я маскирую pswd.Я хочу зашифровать только при хранении

protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
    if (!restoreValue) {
        super.setText((String) defaultValue);
    }
    else {
        try {
            String decrypted = SimpleCrypto.decrypt(Constants.MasterKey, getPersistedString(null));
            super.setText(decrypted);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
0 голосов
/ 13 марта 2012

Во-первых, я знаю, что удобно иметь Preference просмотров, но в вашем особом случае я бы предпочел взять простой EditText и сохранить предпочтения вручную внутри SharedPreferences .

Чтобы ответить на ваш вопрос: в соответствии с документами должно работать, что вы пытались. Чтобы приблизиться к ошибке, попробуйте добавить журналы так:

@Override
public void setText(String text) {
    Log.v("setText", "from " + text);
    try {
        String to = SimpleCrypto.encrypt("BiteMe", text );
        Log.v("setText", "to " + to);
        super.setText(to);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

убедитесь, что ваш класс SimpleCrypt работает так, как ожидалось, и вы можете добавить TextWatcher к EditText и зарегистрировать его, чтобы увидеть, что происходит.

Обратите внимание, что это может быть вообще полезно, поскольку злоумышленник может декомпилировать ваш apk и посмотреть, как работает это шифрование!

...