基于Unity打包安卓后无法正常读取Json配置文件的问题

文章讲述了作者在为公司内部展厅制作视频播放程序时遇到的IP自动获取导致的通信问题。通过尝试在Android上使用persistentData目录进行json配置文件的读写,发现权限问题。最后通过创建文件并手动写入解决读取问题,揭示了Android环境下UnityWebRequest读取persistentData的局限性。
摘要由CSDN通过智能技术生成

   最近没有什么项目做就为公司内部展厅做了一个可用平板控制的视频播放程序,使用的UDP实时通信。由于公司主机IP设置的是自动获取IP地址每次重启就会出现IP随机分配的情况,导致平板与大屏端无法建立通信。

    一开始我是用streamingAssets文件夹来存放我的json配置文件,后面了解到streamingAssetsPath打包到安卓权限为只读,而我希望的对json拥有即可读也可写的权限,通过查找相关说明发现persistentData目录即可读又可写。

   以下是没有改动之前的失败代码段:

        UnityWebRequest www = UnityWebRequest.Get(_View_BackGround.persistentJsonPath);
        yield return www.SendWebRequest();

        if (!www.isNetworkError && !www.isHttpError)
        {
            string jsonString = www.downloadHandler.text;
            _View_BackGround.hostList = JsonMapper.ToObject<List<HostInfo>>(jsonString);
            Debug.LogError(_View_BackGround.hostList[0].ip);
            _View_BackGround.CurrentIpAddress.text = _View_BackGround.hostList[0].ip;
        }
        else
        {
            UnityEngine.Debug.LogError("Failed to load hostinfo.json: " + www.error);
        }

其中_View_BackGround.persistentJsonPath为persistentData目录。

通过UnityWebRequest测试发现 在PC中读取字段是正常的但是打包安卓就不正常了。

后续我试着添加安卓的读写权限:

        Permission.RequestUserPermission("android.permission.WRITE_EXTERNAL_STORAGE");
        Permission.RequestUserPermission("android.permission.READ_EXTERNAL_STORAGE");

打包测试依旧不行。

因为没有打包之前我是无法放置配置文件到persistentData文件夹下的,于是我在程序运行后创建了一个json文件并且写入一些数据。

 private void CreateFile()
    {
        if (!File.Exists(_View_BackGround.persistentJsonPath))
        {
            HostInfo host = new HostInfo
            {
                name = "Host1",
                ip = "192.168.2.1",
                port = 9999,
                macAddress = "08:BF:B8:3D:97:CD"
            };
            // 将HostInfo对象添加到数组中
            HostInfo[] hostList = new HostInfo[] { host };
            // 将HostInfo数组序列化为JSON字符串
            string jsonStr = JsonMapper.ToJson(hostList);
            // 已经有存储权限,将JSON字符串写入配置文件
            File.WriteAllText(_View_BackGround.persistentJsonPath, jsonStr);
        }
        else
        {
            LoadHostInfo();
        }
    }

文件创建了之后进行写入的测试

    public void UpdateJSONAndRestartScene(string JsonString)
    {

        // 创建HostInfo对象
        if (!string.IsNullOrEmpty(JsonString))
        {
            HostInfo host = new HostInfo
            {
                name = "Host1",
                ip = JsonString,
                port = 9999,
                macAddress = "08:BF:B8:3D:97:CD"
            };

            // 将HostInfo对象添加到数组中
            HostInfo[] hostList = new HostInfo[] { host };


            // 将HostInfo数组序列化为JSON字符串
            string jsonStr = JsonMapper.ToJson(hostList);
            // 已经有存储权限,将JSON字符串写入配置文件
            File.WriteAllText(_View_VideoContrl.persistentJsonPath, jsonStr);

        }

    }

打包测试发现 能成功写入。这就非常奇怪了能写入但是无法读取。

想了很久也试了很多不同的方法最后确定了一点那就是IO是可以写入数据的,那么尝试用IO去读是否可取?

于是把UnityWebRequest 部分代码做了改动:

 try
        {
            string jsonString = File.ReadAllText(_View_BackGround.persistentJsonPath);
            _View_BackGround.hostList = JsonMapper.ToObject<List<HostInfo>>(jsonString);
            UnityEngine.Debug.LogError(_View_BackGround.hostList[0].ip);
            _View_BackGround.CurrentIpAddress.text = _View_BackGround.hostList[0].ip;
        }
        catch (Exception e)
        {
            UnityEngine.Debug.LogError("Failed to load hostinfo.json: " + e.Message);
        }

尝试着打包运行 输入后点击保存

              case "ColseConfigPanel":
                    button.onClick.AddListener(() =>
                    {
                        ConfigurationPanel.transform.DOScale(0, 1).SetEase(Ease.Linear).OnComplete(() =>
                        {
                            ConfigurationPanel.gameObject.SetActive(false);
                        });
                    });
                    break;
            }
        }
    }

    /// <summary>
    /// 重启场景
    /// </summary>
    void RestartScene()
    {
        // 在这里编写重启场景的逻辑,例如重新加载当前场景
        Facade.Instance.RemoveComand();
        WindowManager.Instance.windowDIC = new Dictionary<WindowType, BaseWindow>();
        GoManager.Instance.GosDictionary = new Dictionary<string, object>();
        MonoEvent.Instance.ResetUpdate();
        udpClient.Close();
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
当我的场景Reload后发现面板数据有效的储存到Json配置中,问题得到解决!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值