You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity环境下无法识别华为P20后置黑白摄像头的技术求助

华为P20黑白后置摄像头在Unity中无法识别的解决方案

我之前帮朋友处理过类似的华为双摄Unity识别问题,你的情况核心原因是Unity默认的WebCam API局限性——它基于旧的Android Camera 1 API,而华为P20的黑白后置摄像头属于辅助摄像头,Camera 1 API只会枚举主后置(RGB)和前置摄像头,无法识别这类特殊硬件。只有Android Camera2 API才能完整枚举所有摄像头设备,下面是具体的解决思路和步骤:

核心原因拆解

Unity的WebCamTexture.devices接口依赖Android Camera 1 API,这套旧API的设计逻辑是:每个设备只枚举一个前置、一个后置摄像头,无法识别华为P20这种主辅搭配的双后置摄头。而Camera2 API是谷歌为多摄像头场景设计的新一代接口,能完整读取所有摄像头的硬件特性。


具体解决方案

1. 编写Android原生插件(基于Camera2)

你需要写一小段Android原生代码,用CameraManager枚举所有摄像头,并通过硬件特性筛选出黑白摄像头。这里给你一个简化的示例:

原生Java代码(Camera2Helper.java)

import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraCharacteristics;
import android.content.Context;
import com.unity3d.player.UnityPlayer;

public class Camera2Helper {
    // 获取所有摄像头ID
    public static String[] GetAllCameraIds() {
        CameraManager cameraManager = (CameraManager) UnityPlayer.currentActivity.getSystemService(Context.CAMERA_SERVICE);
        try {
            return cameraManager.getCameraIdList();
        } catch (Exception e) {
            e.printStackTrace();
            return new String[0];
        }
    }

    // 判断是否为黑白摄像头
    public static boolean IsMonochromeCamera(String cameraId) {
        CameraManager cameraManager = (CameraManager) UnityPlayer.currentActivity.getSystemService(Context.CAMERA_SERVICE);
        try {
            CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
            int[] capabilities = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
            
            for (int cap : capabilities) {
                // 检查是否具备单色摄像头硬件能力
                if (cap == CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) {
                    return true;
                }
            }
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

2. 在Unity中调用原生代码

把上面的Java代码编译成AAR包(或者直接放在Unity项目的Plugins/Android目录下),然后在C#脚本中调用:

Unity C#代码示例

using UnityEngine;
using UnityEngine.Android;

public class CameraHandler : MonoBehaviour
{
    void Start()
    {
        // Android 6.0+必需动态申请相机权限
        if (!Permission.HasUserAuthorizedPermission(Permission.Camera))
        {
            Permission.RequestUserPermission(Permission.Camera);
        }
        else
        {
            EnumerateCameras();
        }
    }

    void EnumerateCameras()
    {
        // 调用原生插件的方法
        AndroidJavaClass cameraHelper = new AndroidJavaClass("com.your.package.name.Camera2Helper");
        string[] cameraIds = cameraHelper.CallStatic<string[]>("GetAllCameraIds");

        foreach (string id in cameraIds)
        {
            bool isMonochrome = cameraHelper.CallStatic<bool>("IsMonochromeCamera", id);
            Debug.Log($"摄像头ID: {id} | 是否为黑白摄像头: {isMonochrome}");
        }
    }

    void Update()
    {
        // 权限申请通过后自动枚举
        if (Permission.HasUserAuthorizedPermission(Permission.Camera))
        {
            EnumerateCameras();
            enabled = false; // 避免重复执行
        }
    }
}

3. 配置Unity打包设置

  • Player Settings > Android > Publishing Settings中,确保勾选CAMERA权限;
  • 若Unity自动生成的Manifest缺少Camera2特性,手动添加:
    <uses-feature android:name="android.hardware.camera2.full" />
    <uses-permission android:name="android.permission.CAMERA" />
    

4. 处理黑白摄像头的预览流

识别到黑白摄像头后,还需要扩展原生代码,用Camera2 API创建预览会话,通过SurfaceTexture把画面传递到Unity的Texture2D上。这部分可以通过原生层渲染到Unity纹理,或者直接传递帧数据到C#端处理。


关键注意点

  • 华为P20的黑白摄像头LENS_FACING属性也是BACK,不能只通过朝向筛选,必须检查REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME特性;
  • 动态权限申请是Android 6.0+的强制要求,否则会直接拒绝相机访问;
  • Unity的WebCamTexture无法直接使用Camera2枚举的设备,必须通过原生插件桥接。

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

火山引擎 最新活动