Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Hololens上评估OpenFilePicker时调用System.Exception_C#_Unity3d_Hololens_Mrtk_Fileopenpicker - Fatal编程技术网

C# 在Hololens上评估OpenFilePicker时调用System.Exception

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

我正在为hololens应用程序使用MRTK,我需要选择一个用户放在文档文件夹中的文件。我正在尝试访问FileOpenPicker并使用PickSingleFileAsync()函数,通过按按钮获取文件,然后将其加载到我的应用程序中

此函数中的代码基本上就是我正在做的:

然而,当我构建并部署到Hololens Emulator时,当我按下按钮时,它会很好地运行代码的第一部分,但在这一行中我得到一个异常

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