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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:44:51