gpt4 book ai didi

android - 将 SharedPreferences 的自定义子类与 PreferenceActivity 或 PreferenceFragment 结合使用

转载 作者:可可西里 更新时间:2023-11-01 18:48:08 26 4
gpt4 key购买 nike

我正在使用 SharedPreferences 的自定义子类来加密我在应用程序中保存的设置,类似于此处第二个响应中所做的:What is the most appropriate way to store user settings in Android application

我必须保存的偏好数量在增加。之前我只是使用自定义 View 来更新这些首选项,但这会变得很麻烦,我想改用 PreferenceActivity 或 PreferenceFragment。问题是,似乎没有办法让这些类中的任何一个使用我的子类访问我的数据,这意味着它从默认首选项文件中提取的数据将是乱码,因为它没有被解密。

我发现有些人已经创建了 Preference 的自定义实现来加密那里的数据,但我不想这样做,因为数据已经在我的 SharedPreferences 子类中被加密/解密,我想保持这种方式。我也一直在查看 PreferenceActivity 和 PreferenceManager 的源代码,但我不确定处理此问题的最佳方法。

有没有其他人幸运地完成了这样的事情并对我可以从哪里开始有任何建议?

最佳答案

我认为通过将加密保留在您已有的 SharedPrefs 子类中,您限制了模块化和关注点分离。

因此我建议重新考虑对偏好类本身进行子类化(例如 CheckBoxPreference)并在那里执行计算。

理想情况下,您还可以使用某种类型的组合或静态实用程序,这样虽然您可能必须对您使用的每种类型的首选项进行子类化,但您可以使用一个地方来执行加密/解密计算。如果您需要加密或解密其他一些数据,或者 API 发生变化,这也会让您在未来更加灵活。

对于子类化,也许你可以这样做:

例如:

class ListPreferenceCrypt extends ListPreference
{
ListPreferenceCrypt (Context context, AttributeSet attrs) {
super ( context, attrs );
}
ListPreferenceCrypt (Context context) {
super ( context );
}

@Override
public void setValue( String value )
{
//encrypt value
String encryptedVal = MyCryptUtil.encrypt(value);
super.setValue ( encryptedVal );
}

@Override
public String getValue( String key )
{
//decrypt value
String decryptedValue = MyCryptUtil.decrypt(super.getValue ( key ));
return decryptedValue;
}

}

注意上面是伪代码,会有不同的方法来覆盖


您的 XML 可能如下所示:

<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceCategory
android:title="@string/inline_preferences">

<com.example.myprefs.ListPreferenceCrypt
android:key="listcrypt_preference"
android:title="@string/title_listcrypt_preference"
android:summary="@string/summary_listcrypt_preference" />

</PreferenceCategory>

</PreferenceScreen>

编辑

警告/反编译

当我进一步思考这个问题时,我意识到其中一个警告是在反编译 APK 时这种方法并不是特别难以绕过。这确实给出了布局中覆盖类的完整类名(尽管可以通过不使用 XML 来避免)

但是,我认为这并不比子类化 SharedPreferences 安全得多。这也很容易被反编译。最后,如果您想要更强的安全性,您应该考虑其他存储方法。可能是 OAuth 或您链接的帖子中建议的 AccountManager。

关于android - 将 SharedPreferences 的自定义子类与 PreferenceActivity 或 PreferenceFragment 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12377479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com