最近没有什么项目做就为公司内部展厅做了一个可用平板控制的视频播放程序,使用的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配置中,问题得到解决!