OpenCV+Unity打包Android运行报属性访问被拒崩溃解决方法
问题现象
- Unity编辑器环境下OpenCV+Unity项目运行正常,打包为Android安装包启动时直接崩溃
- 崩溃前抛出明确错误日志:
Access denied finding property "persist.vendor.camera.privapp.list" - 使用该OpenCV+Unity资源自带的官方Demo测试,触发完全相同的报错崩溃
- 资源官方明确标注支持Android平台构建,测试项目仅引入OpenCV+Unity相关资源,依赖库包含OpenCvSharp、Unity、UnityEngine,无其他第三方插件
- 复现设备为搭载MIUI 12系统的小米系列设备
问题根因
该问题是MIUI 12系统的私有属性权限管控机制导致:persist.vendor.camera.privapp.list是小米厂商自定义的系统级相机私有属性,仅系统预置的特权白名单应用有权限读取。OpenCV初始化相机模块时默认会尝试读取该属性,旧版本OpenCV for Unity未对该类权限拒绝场景做异常捕获,触发权限错误后直接中断进程造成崩溃。
Unity编辑器运行在Windows/macOS桌面环境,不存在安卓系统的厂商私有属性逻辑,因此不会触发该问题。
解决方案
按优先级从高到低尝试以下操作,不需要修改OpenCV原生so库:
- 关闭OpenCV启动自动初始化相机逻辑
找到路径Assets/OpenCVForUnity/Resources/下的OpenCVForUnitySettings.asset配置文件,取消勾选Init Camera On Startup选项,避免应用冷启动时直接触发相机模块的系统属性读取逻辑。 - 调整Android清单配置
打开项目自定义的AndroidManifest.xml文件,确认仅声明普通相机权限<uses-permission android:name="android.permission.CAMERA" />,不要添加android:sharedUserId="android.uid.system"这类需要系统签名的特权配置;同时在<application>标签下添加属性:<application android:requestLegacyExternalStorage="true" <!-- 其他原有application属性保持不变 --> > - 调整目标SDK版本
打开Unity Player Settings的Android平台配置页,将Target API Level设置为29(对应Android 10),MIUI 12对目标API30及以上的应用私有属性读取管控强度更高,降级到API29可绕过大部分非必要的厂商属性拦截。 - 增加异常捕获兜底
如果项目需要使用相机功能,不要在应用启动阶段直接调用OpenCV相机初始化接口,将初始化逻辑放到用户主动触发相机功能的时机执行,同时包裹异常捕获逻辑,避免权限拒绝直接导致进程崩溃:try { // 对应OpenCV相机组件初始化逻辑 webCamTextureToMatHelper.Init(); } catch (System.Exception e) { Debug.LogWarning("OpenCV相机初始化异常:" + e.Message); // 弹出提示引导用户手动授予相机权限 ShowCameraPermissionGuide(); } - 无相机需求直接移除权限
如果项目完全不需要调用相机功能,直接在Player Settings的Android权限配置中移除CAMERA权限,打包后OpenCV不会初始化相机模块,该问题会直接消失。
注意:该权限拒绝日志是MIUI系统的通用打印日志,原生AOSP安卓系统不会触发该限制,不要随意替换不同版本的OpenCV原生so文件,避免引发其他兼容性问题。
内容的提问来源于stack exchange,提问作者AlberVicky09
相关产品推荐
相关产品推荐

