Unity3D Android中WebView调用摄像头/麦克风方法及UniWebView异常排查
Unity3D Android平台WebView摄像头/麦克风访问及UniWebView权限问题解决
一、通用Android WebView访问摄像头/麦克风的配置步骤
1. 声明权限
在项目的Assets/Plugins/Android/AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> <uses-feature android:name="android.hardware.microphone" android:required="false" />
注意:Android 6.0(API 23)及以上版本需要动态申请权限,不能仅靠Manifest声明。
2. 配置WebView参数
确保WebView启用JavaScript,并设置WebChromeClient处理权限请求:
using UnityEngine; using Android.Webkit; public class WebViewCameraHandler : MonoBehaviour { private WebView webView; void Start() { webView = gameObject.AddComponent<WebView>(); webView.Init(); // 启用JavaScript webView.GetSettings().SetJavaScriptEnabled(true); // 取消媒体播放需用户手势限制 webView.GetSettings().SetMediaPlaybackRequiresUserGesture(false); // 设置自定义WebChromeClient处理权限请求 webView.SetWebChromeClient(new CustomWebChromeClient()); webView.LoadUrl("你的网页地址"); } } public class CustomWebChromeClient : WebChromeClient { public override void OnPermissionRequest(PermissionRequest request) { // 允许摄像头和麦克风权限请求 request.Grant(request.GetResources()); } }
3. 处理HTTPS与明文流量限制
- Android 7.0(API 24)及以上默认禁止明文HTTP流量,若使用本地HTTP网页,需在
AndroidManifest.xml的application标签内添加:android:usesCleartextTraffic="true" - 建议优先使用HTTPS协议的网页,避免系统权限限制。
二、UniWebView在Android构建包中无法打开摄像头的解决方法
编辑器中正常但构建包失效,通常是权限配置或UniWebView特定设置问题,按以下步骤排查:
1. 手动动态申请权限
UniWebView默认不会自动处理Android 6.0+的动态权限,需手动添加权限申请代码:
using UnityEngine; using UniWebView; public class UniWebViewPermissionHandler : MonoBehaviour { void Start() { // 仅在Android真机上申请权限 #if UNITY_ANDROID && !UNITY_EDITOR AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); string[] permissions = new string[] { "android.permission.CAMERA", "android.permission.RECORD_AUDIO" }; currentActivity.Call("requestPermissions", permissions, 1001); #endif // 初始化UniWebView var webView = gameObject.AddComponent<UniWebView>(); webView.Frame = new Rect(0, 0, Screen.width, Screen.height); webView.Load("你的网页地址"); webView.Show(); } }
2. 配置UniWebView权限回调
通过UniWebViewPermissionRequestEvent处理网页的权限请求:
using UniWebView; public class UniWebViewCameraFix : MonoBehaviour { private UniWebView webView; void Start() { webView = GetComponent<UniWebView>(); webView.OnPermissionRequestReceived += OnPermissionRequest; } void OnPermissionRequest(UniWebViewPermissionRequest request) { // 判断是否为摄像头/麦克风权限请求 if (request.Resources.Contains(UniWebViewPermissionResource.Camera) || request.Resources.Contains(UniWebViewPermissionResource.Microphone)) { request.Grant(); } else { request.Deny(); } } void OnDestroy() { if (webView != null) { webView.OnPermissionRequestReceived -= OnPermissionRequest; } } }
3. 检查AndroidManifest合并结果
UniWebView会自动生成部分Manifest配置,需确保最终合并的Manifest包含必要权限:
- 打开
Player Settings > Publishing Settings > Build,勾选Custom Main Manifest,确认Assets/Plugins/Android/AndroidManifest.xml中权限完整。 - 避免其他插件的Manifest配置覆盖摄像头/麦克风权限声明。
4. 验证网页媒体请求代码
确保网页中的getUserMedia调用正确,并添加错误捕获便于排查:
navigator.mediaDevices.getUserMedia({ video: true, audio: true }) .then(stream => { const video = document.getElementById('video'); video.srcObject = stream; }) .catch(err => { console.error("摄像头/麦克风访问失败:", err); alert("错误详情: " + err.message); });
5. 其他排查点
- 升级UniWebView到最新版本,旧版本可能存在Android权限兼容bug。
- 检查Android系统版本:Android 11+需确保权限申请流程符合系统要求,部分厂商设备可能有额外权限限制。
- 关闭Unity的
Strip Engine Code选项(Player Settings > Optimization中),避免WebView相关代码被误剥离。
内容的提问来源于stack exchange,提问作者Don Mokong
相关产品推荐
相关产品推荐

