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

如何在Oculus Quest 3的Unity应用中通过脚本打开默认视频播放器

在Oculus Quest 3的Unity应用中调用系统默认视频播放器的解决方案

问题分析

你尝试的三种方法在Quest平台失效的原因:

  • OpenVideo1(Application.OpenURL):Android平台下Application.OpenURL仅支持HTTP/HTTPS链接,无法直接通过本地文件路径唤起外部应用。
  • OpenVideo2(Process.Start):Process是Windows平台专属API,Android完全不兼容。
  • OpenVideo3(UnityAndroidNativeFileOpener):大概率是Content Provider配置冲突、URI权限未正确授予,或插件对Quest的Android版本适配问题。

正确实现方案

1. 直接调用Android原生API(无需第三方插件)

使用Unity的AndroidJavaClass/AndroidJavaObject直接调用Android系统API,兼容性和可控性更强:

using UnityEngine;
using System.IO;

public class VideoOpener : MonoBehaviour
{
    public void OpenVideo()
    {
        string videoFileName = "DroneAttack_360_TB_30sec.mp4";
        string videoPath = Path.Combine(Application.persistentDataPath, videoFileName);
        
        // 先检查文件是否存在
        if (!File.Exists(videoPath))
        {
            Debug.LogError($"视频文件不存在:{videoPath}");
            return;
        }

        // 调用Android原生逻辑
        using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            
            // 创建打开视频的Intent
            AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", "android.intent.action.VIEW");
            
            // 将本地文件路径转为Content URI(Android安全要求)
            AndroidJavaObject file = new AndroidJavaObject("java.io.File", videoPath);
            AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri");
            AndroidJavaObject videoUri = uriClass.CallStatic<AndroidJavaObject>("fromFile", file);
            
            // 设置视频MIME类型,确保系统匹配正确播放器
            intent.Call<AndroidJavaObject>("setDataAndType", videoUri, "video/mp4");
            
            // 授予外部应用临时读取权限
            intent.Call<AndroidJavaObject>("addFlags", 0x00000001); // 对应Intent.FLAG_GRANT_READ_URI_PERMISSION
            
            // 唤起系统选择器打开视频
            currentActivity.Call("startActivity", intent);
            
            // 可选:将Unity应用后台挂起(Quest平台通常会自动切换)
            currentActivity.Call("moveTaskToBack", true);
        }
    }

    public void OpenGoogle()
    {
        Application.OpenURL("https://www.google.com/");
    }
}

2. 调整Android Manifest配置

确保权限和Activity配置正确适配Android 12(Quest 3的系统版本):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools">
    
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-feature android:name="android.hardware.microphone" android:required="false"/>
    
    <!-- Android 11+ 查询可用视频播放器需要的权限 -->
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission"/>

    <application android:requestLegacyExternalStorage="true">
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:grantUriPermissions="true"
                  android:theme="@style/UnityThemeSelector">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>

3. 关键验证步骤

  • 确认视频文件位置:通过Debug.Log(Application.persistentDataPath)打印路径,使用adb push命令将视频文件传到该目录,确保文件存在。
  • 测试权限:Quest平台下应用私有目录无需外部存储权限,但若视频在公共存储,需额外申请对应权限。
  • MIME类型匹配:不同视频格式需对应正确的MIME类型(如video/avi、video/mkv),避免系统无法识别。

内容的提问来源于stack exchange,提问作者My pillar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:02:21