我的应用当前正在使用
sp = PreferenceManager.getDefaultSharedPreferences(ctx);
以获取共享首选项对象。 由于一些安全要求,现在我需要升级它以使用android喷气背包库中提供的EncryptedSharedPpreferences。
这里发生的事情是,当我使用加密共享首选项对象时,我丢失了存储在普通共享首选项文件中的所有数据。
如何在加密共享首选项上获取所有数据。
答案:
我的迁移如下所示:
fun migrate() {
val oldPreferences = PreferenceManager.getDefaultSharedPreferences(context)
val newPreferences = EncryptedSharedPreferences.create(...)
with(newPreferences.edit()) {
oldPreferences.all.forEach { (key, value) ->
when (value) {
is Boolean -> putBoolean(key, value)
is Float -> putFloat(key, value)
is String -> putString(key, value)
is Int -> putInt(key, value)
is Long -> putLong(key, value)
is Set<*> -> putStringSet(key, value.map { it.toString() }.toSet())
else -> throw IllegalStateException("unsupported type for shared preferences migration")
}
}
apply()
}
oldPreferences.edit().clear().apply()
}
可以在不创建新的共享首选项文件的情况下执行此操作,但是您为什么要...
解释:
任何共享首选项都存储在.xml
文件中。您可以找到该文件并读取它,因此不难看出它发生了什么。
我尝试将EncryptedSharedPreferences
与现有文件一起使用,旧值仍未加密。EncryptedSharedPreferences
现在无法访问旧值。
EncryptedSharedPreferences
没有加密文件。它们分别加密密钥和值,因此您的首选项.xml文件可能如下所示:
<map>
<string name="__androidx_security_crypto_encrypted_prefs_key_keyset__">12a9018b0938...</string>
<string name="AWNywuPwU...">ARu2fgn5N7wV...</string>
<string name="__androidx_security_crypto_encrypted_prefs_value_keyset__">1288018cc6...</string>
</map>
这意味着您无法运行某些单行代码来加密现有文件。所以我相信唯一的方法是按照答案所示进行自己的迁移。
希望对你有帮助