如何在MAUI应用中读取旧Xamarin.Android应用的SharedPreferences?
MAUI读取旧Xamarin.Android应用用户设置的解决方案
关键错误:SharedPreferences文件名匹配错误
旧Xamarin.Android应用通过PreferenceManager.GetDefaultSharedPreferences(Application.Context)保存的默认设置,对应的SharedPreferences文件名是**default_preferences**,而非你代码中拼接的oldContext.PackageName + "_preferences",这是导致读取为空的核心原因。
修正后的代码
var oldContext = Application.Context.CreatePackageContext(packageName, PackageContextFlags.IgnoreSecurity); // 使用默认SharedPreferences文件名 var settingsList = oldContext.GetSharedPreferences("default_preferences", FileCreationMode.Private);
额外验证与排查步骤
- 确认旧应用的实际文件名:在Android设备的
/data/data/[旧包名]/shared_prefs/目录下,查看存在的xml文件,常见名称为default_preferences.xml或[旧包名]_preferences.xml(若旧应用使用PreferenceActivity/Fragment并指定了名称)。 - 配置必要权限:
- Android 11+需添加包查询权限,可在
AndroidManifest.xml中添加:<!-- 精细权限(推荐) --> <queries> <package android:name="你的旧应用包名" /> </queries> <!-- 或全局查询权限(仅必要时使用) --> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> - 若直接读取文件路径,Android 10+需处理存储访问限制,可尝试添加
READ_EXTERNAL_STORAGE权限并适配Scoped Storage。
- Android 11+需添加包查询权限,可在
- 签名一致性检查:如果旧应用与新MAUI应用签名不一致,Android 12+可能会限制跨应用SharedPreferences访问,需确保两者使用相同签名。
- 直接文件解析备选:若通过包上下文读取仍失败,可尝试直接读取xml文件解析:
var prefsFilePath = Path.Combine("/data/data/", packageName, "shared_prefs", "default_preferences.xml"); if (File.Exists(prefsFilePath)) { var xmlContent = File.ReadAllText(prefsFilePath); // 自行解析XML内容获取设置项 }
内容的提问来源于stack exchange,提问作者dkmorb
相关产品推荐
相关产品推荐

