HoloLens 2应用调用LaunchUriAsync启动外部应用问题排查
HoloLens 2 UWP应用启动原生应用并保持自身交互的解决方案
问题概述
在Unity 2021.3.23f1 + MRTK 3.0开发的HoloLens 2 UWP应用中,需实现以下需求:
- 启动原生应用(PDF浏览器、照片查看器、3D查看器)打开对应文件
- 自身应用保持世界空间可交互状态,不冻结,支持多外部窗口同时运行
当前遇到的问题:
- 通过设备文件浏览器打开文件时,自身应用后台冻结,UI粘滞于视线,关闭外部应用后才恢复正常
- 使用
LaunchUriAsync调用无反应,无法识别Microsoft.System库以设置启动优先级
解决步骤
1. 配置UWP权限与Unity基础设置
- 在Unity的
Player Settings > UWP > Publishing Settings中,勾选Internet Client权限(部分原生应用依赖此权限) - 在
Capabilities中添加privateNetworkClientServer和internetClientServer(涉及本地文件Uri时需开启) - 在
Player Settings > UWP > Other Settings中,设置Scripting Backend为.NET 4.x Equivalent,Api Compatibility Level为.NET 4.x
2. 修复LaunchUriAsync调用(UI线程执行+正确Uri格式)
LaunchUriAsync必须在UI线程执行,且需使用UWP可识别的Uri格式,以下是可直接复用的代码:
using UnityEngine; using Windows.System; using Windows.Foundation; public class ExternalAppLauncher : MonoBehaviour { // 启动Edge浏览器打开PDF文件 public void LaunchPDF(string localFilePath) { string uriString = $"file:///{localFilePath.Replace("\\", "/")}"; var uri = new Uri(uriString); UnityEngine.WSA.Application.InvokeOnUIThread(async () => { var options = new LauncherOptions(); options.TargetApplicationPackageFamilyName = "Microsoft.MicrosoftEdge_8wekyb3d8bbwe"; bool success = await Launcher.LaunchUriAsync(uri, options); if (!success) Debug.LogError("PDF应用启动失败"); }, false); } // 启动照片查看器打开图片 public void LaunchImage(string localFilePath) { string uriString = $"file:///{localFilePath.Replace("\\", "/")}"; var uri = new Uri(uriString); UnityEngine.WSA.Application.InvokeOnUIThread(async () => { var options = new LauncherOptions(); options.TargetApplicationPackageFamilyName = "Microsoft.Windows.Photos_8wekyb3d8bbwe"; bool success = await Launcher.LaunchUriAsync(uri, options); if (!success) Debug.LogError("照片查看器启动失败"); }, false); } // 启动3D查看器打开模型文件 public void Launch3DModel(string localFilePath) { string uriString = $"file:///{localFilePath.Replace("\\", "/")}"; var uri = new Uri(uriString); UnityEngine.WSA.Application.InvokeOnUIThread(async () => { var options = new LauncherOptions(); options.TargetApplicationPackageFamilyName = "Microsoft.Microsoft3DViewer_8wekyb3d8bbwe"; bool success = await Launcher.LaunchUriAsync(uri, options); if (!success) Debug.LogError("3D查看器启动失败"); }, false); } }
3. 解决Microsoft.System库无法识别的问题
官方文档提及的优先级设置无需引用Microsoft.System,直接通过LauncherOptions.TargetApplicationPackageFamilyName指定目标应用包名即可,确保外部应用独立启动且自身应用不被挂起。
4. 确保自身应用保持世界空间交互
- 确认MRTK的空间感知配置正确,所有UI元素绑定到世界空间锚点
- 在
Player Settings > UWP > Other Settings中勾选Run In Background,保证应用在后台时仍能维持空间状态 - 避免在主线程执行耗时操作,保障应用响应性
验证要点
- 需在HoloLens 2真机上测试,模拟器无法复现部分窗口交互行为
- 确保文件路径正确:本地文件可存放于
Application.persistentDataPath下,转换Uri时注意替换路径分隔符 - 若启动失败,可通过HoloLens设置>应用>应用和功能,核对目标应用的包名是否正确
内容的提问来源于stack exchange,提问作者mc92
相关产品推荐
相关产品推荐

