我正在使用 XML 首选项和
PreferenceFragmentCompat
。我想加密一些值,例如密码,但不加密其他值,例如主题设置。看来我要用的是EncryptedSharedPreferences
。但我不知道如何让它与用户界面一起工作。我看到两个问题:
Preference
应该使用这个或这个SharedPreference
实例;PreferenceFragmentCompat
使用单个标准 SharedPreference
文件以外的任何内容,如 PreferenceManager#setSharedPreferencesName
等方法设置的。问题是,
为了对现有代码库进行最小程度的更改,您可以手动处理敏感首选项的存储和检索。这涉及:
创建 EncryptedSharedPreferences:在您的
EncryptedSharedPreferences
中初始化 PreferenceFragmentCompat
。
自定义 PreferenceChangeListener:实现
SharedPreferences.OnSharedPreferenceChangeListener
,您可以在其中拦截对特定首选项的更改并手动处理其在 EncryptedSharedPreferences
中的存储。
覆盖默认行为:覆盖
PreferenceFragmentCompat
中某些首选项的默认行为,以从EncryptedSharedPreferences
读取和写入。
如何进行的示例:
public class MySettingsFragment extends PreferenceFragmentCompat {
private SharedPreferences encryptedPreferences;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences, rootKey);
// Initialize EncryptedSharedPreferences
encryptedPreferences = ... // Your EncryptedSharedPreferences initialization
// Set listener
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(listener);
}
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("sensitive_key")) {
// Handle the change using encryptedPreferences
String value = prefs.getString(key, "");
encryptedPreferences.edit().putString(key, value).apply();
// Optionally, clear the original to ensure it's not stored unencrypted
prefs.edit().remove(key).apply();
}
}
};
@Override
public void onResume() {
super.onResume();
// Update preferences display manually for encrypted prefs
Preference sensitivePref = findPreference("sensitive_key");
if (sensitivePref != null) {
String value = encryptedPreferences.getString("sensitive_key", "");
sensitivePref.setSummary(value);
}
}
}
如果您愿意进行重大重写:
自定义首选项类:为内部使用
Preference
进行存储和检索的敏感数据创建自定义 EncryptedSharedPreferences
类。
自定义 PreferenceFragmentCompat:开发可以处理不同
PreferenceFragmentCompat
实例的自定义 SharedPreferences
。重写方法以将读取和写入定向到适当的SharedPreferences
。
与 XML 集成:扩展 XML 首选项定义以包含标记或属性,以指示哪些首选项应使用加密存储。然后,您的自定义首选项类可以使用此信息。
示例:
<com.example.MyEncryptedEditTextPreference
android:key="encrypted_preference"
android:title="Encrypted Preference"
... />
此自定义
EditTextPreference
将在内部使用 EncryptedSharedPreferences
作为其值。