You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:12:41