如何在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
相关产品推荐
相关产品推荐

