C# 在Hololens上评估OpenFilePicker时调用System.Exception
我正在为hololens应用程序使用MRTK,我需要选择一个用户放在文档文件夹中的文件。我正在尝试访问FileOpenPicker并使用PickSingleFileAsync()函数,通过按按钮获取文件,然后将其加载到我的应用程序中 此函数中的代码基本上就是我正在做的: 然而,当我构建并部署到Hololens Emulator时,当我按下按钮时,它会很好地运行代码的第一部分,但在这一行中我得到一个异常C# 在Hololens上评估OpenFilePicker时调用System.Exception,c#,unity3d,hololens,mrtk,fileopenpicker,C#,Unity3d,Hololens,Mrtk,Fileopenpicker,我正在为hololens应用程序使用MRTK,我需要选择一个用户放在文档文件夹中的文件。我正在尝试访问FileOpenPicker并使用PickSingleFileAsync()函数,通过按按钮获取文件,然后将其加载到我的应用程序中 此函数中的代码基本上就是我正在做的: 然而,当我构建并部署到Hololens Emulator时,当我按下按钮时,它会很好地运行代码的第一部分,但在这一行中我得到一个异常 StorageFile file=wait openPicker.PickSingleFil
StorageFile file=wait openPicker.PickSingleFileAsync()代码>
经过广泛的研究和一些挫折之后,我发表了一篇关于它的非常糟糕和模糊的帖子
在那篇文章中,我引用了两年前制作的这篇文章,它说你不能这样做,但你可以使用文件选择器,在这个例子中,就是FileOpenPicker
我在WindowsMixedRealityDeveloper论坛中找到了一篇相关的文章,但这不是我的问题,我仍然觉得有必要在这篇文章中加入
我还想补充一点,我确实安装了一个文件选择器应用程序。根据调用FileOpenPicker,它将打开设备上首次安装的任何文件选择器
此外,在生成的MRTK和Appx中,我正在确保启用“PictureLibrary”功能的权限
任何帮助都将不胜感激,我觉得我已经等了太久,无法就这个话题发表更正式的帖子,我希望能得到一些答案。谢谢 我终于找到了解决问题的办法。我看过的所有文档中都没有提到的最大的调用是这个UnityEngine.WSA.Application.invokeonuthread()
我没有遇到这个问题,也没有找到任何关于MRTK+unity用于全息透镜开发的解决方案的文档。因此,对于那些正在寻找解决方案的人,我将引用上面的链接,以防将来它被破坏
#if !UNITY_EDITOR && UNITY_WSA_10_0
Debug.Log("***********************************");
Debug.Log("File Picker start.");
Debug.Log("***********************************");
UnityEngine.WSA.Application.InvokeOnUIThread(async () =>
{
var filepicker = new FileOpenPicker();
// filepicker.FileTypeFilter.Add("*");
filepicker.FileTypeFilter.Add(".txt");
var file = await filepicker.PickSingleFileAsync();
UnityEngine.WSA.Application.InvokeOnAppThread(() =>
{
Debug.Log("***********************************");
string name = (file != null) ? file.Name : "No data";
Debug.Log("Name: " + name);
Debug.Log("***********************************");
string path = (file != null) ? file.Path : "No data";
Debug.Log("Path: " + path);
Debug.Log("***********************************");
//This section of code reads through the file (and is covered in the link)
// but if you want to make your own parcing function you can
// ReadTextFile(path);
//StartCoroutine(ReadTextFileCoroutine(path));
}, false);
}, false);
Debug.Log("***********************************");
Debug.Log("File Picker end.");
Debug.Log("***********************************");
#endif
编辑:
关于“InvokeOnUIThread”和“InvokeOnAppThread”的含义的一点解释
想想你的MRTK应用程序在hololens上运行的方式,你的应用程序运行在它自己的小环境中,在你的应用程序中有一个MRTK特定的unity引擎处理函数调用。该应用程序随后在hololens更大的应用程序(操作系统)中运行。因此,无论何时调用特定于UWP的函数(只有hololens才能理解的事情),都需要在InvokeonuThread内调用这些函数。现在,当您在该函数调用中运行时,如果需要对MRTK、unity或您自己创建的函数进行任何函数调用,则需要使用InvokeOnAppThread。这本质上告诉应用程序您想要进行一些UWP函数调用,然后在任何时候,如果您仍然在InvokeOnUIThread调用中需要从UWP函数调用传回任何信息,则需要使用InvokeOnAppThread
从我发现的情况来看,这基本上就是整个过程的工作原理,我认为这对文档记录很重要。我也需要这个!我能够让它在Unity 2020.3.9f1和MRTK 2.7预览版5中工作。非常感谢分享您的经验,非常感谢!令人惊叹的!我很高兴你能利用这一点!在一篇又一篇的文章中挖掘是很困难的,没有任何明确的解释就找不到解决办法。我希望这可以帮助以后的许多人。我还添加了关于每个调用函数如何工作以及它们的含义的解释。
#if !UNITY_EDITOR && UNITY_WSA_10_0
Debug.Log("***********************************");
Debug.Log("File Picker start.");
Debug.Log("***********************************");
UnityEngine.WSA.Application.InvokeOnUIThread(async () =>
{
var filepicker = new FileOpenPicker();
// filepicker.FileTypeFilter.Add("*");
filepicker.FileTypeFilter.Add(".txt");
var file = await filepicker.PickSingleFileAsync();
UnityEngine.WSA.Application.InvokeOnAppThread(() =>
{
Debug.Log("***********************************");
string name = (file != null) ? file.Name : "No data";
Debug.Log("Name: " + name);
Debug.Log("***********************************");
string path = (file != null) ? file.Path : "No data";
Debug.Log("Path: " + path);
Debug.Log("***********************************");
//This section of code reads through the file (and is covered in the link)
// but if you want to make your own parcing function you can
// ReadTextFile(path);
//StartCoroutine(ReadTextFileCoroutine(path));
}, false);
}, false);
Debug.Log("***********************************");
Debug.Log("File Picker end.");
Debug.Log("***********************************");
#endif