使用 Unity3D 写入 HoloLens 2 上的 Application.persistentDataPath,然后通过设备门户网站访问文件
Posted
技术标签:
【中文标题】使用 Unity3D 写入 HoloLens 2 上的 Application.persistentDataPath,然后通过设备门户网站访问文件【英文标题】:Writing to Application.persistentDataPath on HoloLens 2 with Unity3D and accessing files afterward through device web portal 【发布时间】:2021-06-28 16:56:50 【问题描述】:我正在开发 Unity 3D 中的 Hololens 2 应用程序。我正在尝试将配置文件写入设备并稍后通过 Web 浏览器中的设备门户访问它。在应用程序本身中,我被告知该文件正在写入 AppData/Local/Packages/[App Name]/LocalState/[File Name].txt。但是,当我去查看 LocalAppData/[App Name] 时,文件夹 LocalState/ 甚至都不存在。我怀疑这与 Unity 生成的 VS 项目的 Package.appxmanifest 文件中的错误有关。
这是我用来写入文件的相关 C# 代码:
void ReadResolution()
string path = Path.Combine(Application.persistentDataPath, mResFilename);
mExcept = $"No exceptions thrown by file IO while writing to \n\"path\".";
if(System.IO.File.Exists(path) && new FileInfo(path).Length > 0)
try
StreamReader reader = new StreamReader(path);
if(reader != null)
string content = reader.ReadToEnd();
string[] split = content.Split(' ');
mWidth = Int32.Parse(split[0]);
mHeight = Int32.Parse(split[1]);
catch (Exception e)
mExcept = "File Read Exception: " + e.Message;
else
try
using (TextWriter writer = File.CreateText(path))
string line = mWidth.ToString() + " " + mHeight.ToString();
writer.WriteLine(line);
catch (Exception e)
mExcept = "File Write Exception: " + e.Message;
Debug.Log(mExcept);
我正在使用成员字段 mExcept 来记录过程中抛出的任何消息或异常。它告诉我文件写入成功,但也许我只是在自欺欺人?
以下是项目的 Package.appxmanifest 文件中的相关部分:
<Package xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:uap2="http://schemas.microsoft.com/appx/manifest/uap/windows10/2"
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4"
xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10"
xmlns:mobile="http://schemas.microsoft.com/appx/manifest/mobile/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap uap2 uap3 uap4 mp mobile iot rescap"
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10">
.
.
.
<Capabilities>
<rescap:Capability Name="broadFileSystemAccess" />
<uap:Capability Name="documentsLibrary" />
<Capability Name="internetClient" />
<Capability Name="internetClientServer" />
<Capability Name="privateNetworkClientServer" />
<uap2:Capability Name="spatialPerception" />
<uap3:Capability Name="remoteSystem" />
<DeviceCapability Name="microphone" />
<DeviceCapability Name="gazeinput" />
<DeviceCapability Name="wiFiControl" />
<DeviceCapability Name="webcam" />
</Capabilities>
感谢任何帮助。提前致谢。
【问题讨论】:
LocalAppData/[App Name]
!= AppData/Local/Packages/[App Name]
不过! ...你确定你在正确的地方搜索吗?
所以我的理解是,Windows 会根据您从哪里查看路径(应用程序与门户网站)来调整路径。我正在寻找其他应用程序写入存储的文件出现的地方。因此,对于我正在使用的其他一些应用程序,事情将进入 LocalAppData[App Name]\LocalState\。我的应用不存在 LocalState 文件夹。
【参考方案1】:
好的,我想通了。
为了写入持久存储,Unity 生成的 VS 项目需要在其 Package.appxmanifest 文件中包含我所缺少的另一个功能。也就是说,除了您正在使用的任何其他内容之外,您还需要声明 uap 功能“removableStorage”。例如,这就是我的清单文件的功能部分现在的样子:
<Capabilities>
<uap:Capability Name="documentsLibrary" />
<Capability Name="internetClient" />
<Capability Name="internetClientServer" />
<Capability Name="privateNetworkClientServer" />
<uap:Capability Name="removableStorage" />
<uap:Capability Name="videosLibrary" />
<uap:Capability Name="objects3D" />
<uap2:Capability Name="spatialPerception" />
<DeviceCapability Name="webcam" />
<DeviceCapability Name="microphone" />
<DeviceCapability Name="location" />
<DeviceCapability Name="wiFiControl" />
</Capabilities>
另外,请确保在安装固定版本之前完全卸载设备上的所有旧版本。这也给我带来了麻烦。
祝你有美好的一天:)
【讨论】:
【参考方案2】:我还在 Unity 中使用了 Application.persistentDataPath
,它必须在 Hololens 2 上工作。
但是它不起作用,即;文件未保存,因为我犯了一个错误(我要保存的列表未初始化为新列表)。
在我更正之后,带有列表的文件将保存在persistantDatapath
上,并且无需添加上述功能即可工作。
【讨论】:
以上是关于使用 Unity3D 写入 HoloLens 2 上的 Application.persistentDataPath,然后通过设备门户网站访问文件的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D Hololens 访问 Windows.Storage.KnownFolders
Unity3D UWP Hololens:使用 InputField 的 Web 门户输入而不会弹出 TouchScreenKeyboard