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

在Unity中使用WebCamDevice访问Android多后置摄像头问题

Unity Android 无法枚举广角物理摄像头的解决方案

问题根源

Unity的WebCamTexture.devices在Android平台上默认只会返回逻辑摄像头(比如“后置摄像头”“前置摄像头”这类逻辑分组),不会单独枚举物理摄像头(主摄、广角、长焦等)。这和你猜测的逻辑/物理摄像头差异完全一致——Unity对Android摄像头的封装偏上层,没有暴露底层物理摄像头的枚举能力,官方也未提供相关细节文档。

解决思路

通过Unity的Android Java交互API直接调用Android原生CameraManager,枚举所有物理摄像头,识别出广角镜头后,用对应的设备名称初始化WebCamTexture。

代码实现

1. 枚举物理摄像头并识别广角镜头

using UnityEngine;

public class WideAngleCameraHelper : MonoBehaviour
{
    public void InitWideAngleCamera()
    {
        // 检查摄像头权限
        if (!Permission.HasUserAuthorizedPermission(Permission.Camera))
        {
            Permission.RequestUserPermission(Permission.Camera);
            return;
        }

        // 调用Android原生CameraManager
        using (AndroidJavaClass cameraManagerClass = new AndroidJavaClass("android.hardware.camera2.CameraManager"))
        using (AndroidJavaObject cameraManager = cameraManagerClass.CallStatic<AndroidJavaObject>("getInstance", 
               AndroidJavaObject.FindObjectOfType<AndroidJavaClass>("android.content.Context")))
        {
            string[] cameraIds = cameraManager.Call<string[]>("getCameraIdList");

            foreach (string id in cameraIds)
            {
                AndroidJavaObject characteristics = cameraManager.Call<AndroidJavaObject>("getCameraCharacteristics", id);
                
                // 过滤后置摄像头(1代表后置,0为前置)
                int lensFacing = characteristics.Get<int>("android.lens.facing");
                if (lensFacing != 1)
                    continue;

                // 通过最小焦距判断广角镜头(一般广角焦距小于1.0,单位为归一化值)
                float[] focalLengths = characteristics.Get<float[]>("android.lens.info.availableFocalLengths");
                if (focalLengths != null && focalLengths[0] < 1.0f)
                {
                    string deviceName = characteristics.Get<string>("android.camera.device.name");
                    Debug.Log("识别到广角摄像头:" + deviceName);
                    
                    // 初始化并启动广角摄像头
                    WebCamTexture wideAngleCam = new WebCamTexture(deviceName);
                    wideAngleCam.Play();
                    // 可将纹理赋值给RawImage等组件显示
                }
            }
        }
    }
}

2. 注意事项

  • 项目目标Android API等级需至少为21(Android 5.0),因为Camera2 API从该版本开始引入。
  • 在AndroidManifest.xml中补充Camera2相关特性声明(可选,确保设备支持完整摄像头功能):
    <uses-feature android:name="android.hardware.camera2.full" />
    
  • 不同厂商的摄像头特性存在差异,判断广角的逻辑可根据实际设备调整(比如通过视角参数android.lens.info.horizontalViewAngle判断,广角视角通常大于70度)。

补充说明

Unity的WebCamTexture设计面向通用场景的逻辑摄像头访问,若需精细控制物理摄像头,调用原生API是当前唯一可靠的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:10:43