【问题标题】:AssetManager vs Internal Storage: How can I store cross-platform config.json file in Xamarin Android that I want to edit later?AssetManager 与内部存储:如何在 Xamarin Android 中存储我想稍后编辑的跨平台 config.json 文件?
【发布时间】:2019-08-13 23:46:21
【问题描述】:

我希望能够预先配置我的 Android 应用程序以包含一个可读/可写的 json 文件,该文件也可在其他平台(iOS、UWP)上使用。我开始查看 AssetManager,但发现我只能读取文件,不能稍后编辑。

内部存储是答案吗?如果是这样,我如何使用此文件预填充应用程序的内部存储?除了在 C# 代码中执行完整的写入方法之外,我在网上找不到任何关于如何执行此操作的文档,这违背了在所有平台上共享相同 config.json 文件的目的。我只想让我的 Android 应用程序存储这个 config.json 文件,并让该文件可读可写。

任何帮助将不胜感激。

【问题讨论】:

    标签: xamarin.android android-assets android-internal-storage android-assetmanager


    【解决方案1】:

    我决定回答我自己的问题并展示如何在代码中完成。在这个答案中,我同时使用 Android 资产和内部存储来操作包含我的序列化对象的文件。

    1) 将您的文件复制到 Xamarin.Android 项目的 Assets 文件夹中,并将其 Build Action 更改为“AndroidAsset”。这将确保该文件最初与您的 Android 应用打包在一起。

    2) 在您的 C# 代码中,您真正想要的是从您的 Android 应用程序的内部存储读取和写入此文件,而不是从 AssetManager(无论如何您不能写入 AssetManager,只能读取!)。所以要做到这一点,你必须先从 AssetManager 中拉取文件,然后所有后续的读/写都将从内部存储中发生。

        /// <summary>
        /// This method will read the application settings from internal storage.  
        /// If it can't find it, it will use the default AndroidAsset version of 
        /// the appsettings.json file from this project's Asset folder.
        /// </summary>
        /// <returns></returns>
        public async Task<DefaultSettings> GetDefaultSettingsAsync()
        {
            var path = Application.Context.FilesDir.Path;
            if (File.Exists(Path.Combine(path, "appsettings.json")))
            {
                using (var sr = Application.Context.OpenFileInput("appsettings.json"))
                {
                    using (var ms = new MemoryStream())
                    {
                        await sr.CopyToAsync(ms);
                        var memoryBytes = ms.ToArray();
                        var content = System.Text.Encoding.Default.GetString(memoryBytes);
                        var defaultSettings = JsonConvert.DeserializeObject<DefaultSettings>(content);
                        return defaultSettings;
                    }
                }
            }
            else
            {
                var result = await GetDefaultSettingsAssetAsync();
                return result;
            }
        }
    
        /// <summary>
        /// This method gets the appsettings.json file from the Android AssetManager, in the case
        /// where you do not have an editable appsettings.json file yet in your Android app's internal storage.
        /// </summary>
        /// <returns></returns>
        private static async Task<DefaultSettings> GetDefaultSettingsAssetAsync()
        {
            try
            {
                var assetsManager = MainActivity.Instance.Assets;
    
                using (var sr = assetsManager.Open("appsettings.json"))
                {
                    using (var ms = new MemoryStream())
                    {
                        await sr.CopyToAsync(ms);
                        var memoryBytes = ms.ToArray();
                        var content = System.Text.Encoding.Default.GetString(memoryBytes);
                        var defaultSettings = JsonConvert.DeserializeObject<DefaultSettings>(content);
    
                        // This will write the Asset to Internal Storage for the first time.  All subsequent writes will occur using SaveDefaultSettingsAsync.
                        using (var stream = Application.Context.OpenFileOutput("appsettings.json", FileCreationMode.Private))
                        {
                            await stream.WriteAsync(memoryBytes, 0, memoryBytes.Length);
                        }
    
                        return defaultSettings;
                    }
                }
            }
            catch (Exception ex)
            {
                return new DefaultSettings();
            }
        }
    
        /// <summary>
        /// This method will save the DefaultSettings to your appsettings.json file in your Android App's internal storage.
        /// </summary>
        /// <param name="settings"></param>
        /// <returns></returns>
        public async Task SaveDefaultSettingsAsync(DefaultSettings settings)
        {
            using (var stream = Application.Context.OpenFileOutput("appsettings.json", FileCreationMode.Private))
            {
                var content = JsonConvert.SerializeObject(settings);
                var bytes = Encoding.Default.GetBytes(content);
                await stream.WriteAsync(bytes, 0, bytes.Length);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 2010-10-25
      相关资源
      最近更新 更多