You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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。
  • 签名一致性检查:如果旧应用与新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:53:22