WebView.CapturePreviewToStreamAsync()失败,但仅在具有Unity3D的HoloLens上

时间:2018-07-20 15:32:25

标签: c# xaml unity3d webview hololens

当前,我们正在尝试在一个应用程序中结合使用Unity3D全息图和HTML渲染。这个想法的工作原理如下:

1)启动一个XAML应用程序,该应用程序的主窗口包含一个WebView组件(使用XAML应用程序模板)
2)切换到Holographic(DirectX)模式(基本上是从Holographic应用程序模板复制代码)
3)WebView仍在后台运行
4)我们可以调用WebView.Navigate()方法
5)通过CapturePreviewToStreamAsync() API将WebView的内容呈现到位图
6)将位图转换为纹理并将其显示在DirectX一侧,从而实现带有全息图的HTML渲染

到目前为止,我们的实验工作在:
1)C ++ / CX
2)C#

但是,如果尝试使用Unity3D进行相同的操作,就会遇到问题。这是我们的工作:
1)我们创建了具有混合现实支持的Unity3D项目
2)我们将“ UWP构建类型”设置为“ XAML”(而不是D3D)导出Unity项目。 该应用程序在MSVS 2017中构建,并以XAML应用程序启动,该应用程序会自动切换到全息空间,正确显示Unity中定义的场景。
3)我们进一步编辑XAML主页面以包含一个WebView元素(指向网页)。

现在,如果我们调用WebView组件的CapturePreviewToStreamAsync() API, 抛出System.Exception并显示以下消息: 灾难性故障(HRESULT的异常:0x8000FFFF(E_UNEXPECTED))

如果我们同时使用Hololens眼镜和仿真器,则该错误是100%可重现的。

任何建议可能是造成这种现象的原因吗?似乎Unity以不同的方式创建了应用程序XAML部分的主窗口,但是由于窗口的创建主要发生在重新编译的Unity模块中,因此我们无权访问。

谢谢! 马丁

1 个答案:

答案 0 :(得分:1)

尽管我们找不到导致异常的原因,但我们遵循Jonathan Antoine在此博客条目中的说明找到了一种解决方法:

launch a 3D (Holograms) app from a 2D #XAML app and going back to it

使事情工作的方法是:
1.从上方为Unity3D生成的应用程序创建一个新的XAML页面(将其命名为WebViewPage,其中包含我们的WebView组件)
2.修改Unity生成的XAML应用,以在启动时导航到WebViewPage,而不是MainPage
3.需要切换到全息空间时,只需以通常的方式导航到MainPage:

    var frame = new Frame();
    Window.Current.Content = frame;
    frame.Navigate(typeof(MainPage));  

4。您可能还需要将appCallbacks对象从生成的应用程序中,从App类移动到MainPage

那解决了问题。现在CapturePreviewToStreamAsync()调用可以工作并返回数据。

注意:我们注意到该应用程序使HoloLens模拟器(10.0.14393.1358)处于某种状态,该状态不允许在不重新启动模拟器的情况下再次启动该应用程序。但是这个问题不会在实际设备上出现

希望对某人有所帮助
马丁