使用 XML 首选项,如何使某些“Preference”使用不同的“SharedPreferences”实例?

问题描述 投票:0回答:1

我正在使用 XML 首选项和

PreferenceFragmentCompat
。我想加密一些值,例如密码,但不加密其他值,例如主题设置。看来我要用的是
EncryptedSharedPreferences
。但我不知道如何让它与用户界面一起工作。我看到两个问题:

  • 似乎没有办法指定这个或这个
    Preference
    应该使用这个或这个
    SharedPreference
    实例;
  • 似乎没有办法让
    PreferenceFragmentCompat
    使用单个标准
    SharedPreference
    文件以外的任何内容,如
    PreferenceManager#setSharedPreferencesName
    等方法设置的。

问题是,

  • 有什么方法可以在对当前代码库进行最小更改的情况下完成这项工作?而且,
  • 如果我愿意进行大量重写,那么完成这项工作的理想方法是什么?
android sharedpreferences
1个回答
0
投票

1.最小改变方法

为了对现有代码库进行最小程度的更改,您可以手动处理敏感首选项的存储和检索。这涉及:

  • 创建 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);
        }
    }
}

2.大量重写方法

如果您愿意进行重大重写:

  • 自定义首选项类:为内部使用

    Preference
    进行存储和检索的敏感数据创建自定义
    EncryptedSharedPreferences
    类。

  • 自定义 PreferenceFragmentCompat:开发可以处理不同

    PreferenceFragmentCompat
    实例的自定义
    SharedPreferences
    。重写方法以将读取和写入定向到适当的
    SharedPreferences

  • 与 XML 集成:扩展 XML 首选项定义以包含标记或属性,以指示哪些首选项应使用加密存储。然后,您的自定义首选项类可以使用此信息。

示例:

<com.example.MyEncryptedEditTextPreference
    android:key="encrypted_preference"
    android:title="Encrypted Preference"
    ... />

此自定义

EditTextPreference
将在内部使用
EncryptedSharedPreferences
作为其值。

© www.soinside.com 2019 - 2024. All rights reserved.