☰
相机预配置返回不支持还继续创建输出?HarmonyOS Preconfig 要把组合探测放在会话前
2026/10/5 6:59:23 网站建设 项目流程

相机预配置返回不支持还继续创建输出?HarmonyOS Preconfig 要把组合探测放在会话前

先把现象说清楚

测试机上 PRECONFIG_4K 与 16:9 一次成功,换到另一台设备却在创建 VideoOutput 时失败。预配置只是把常用拍照和录像参数组合封装起来,并不保证每台设备支持所有类型与画幅。官方提供 720P、1080P、4K、高质量四类预配置和 1:1、4:3、16:9 三种比例,并要求先用 CanPreconfig 系列接口检查组合支持。

写代码前先核对官方边界

检查项正确边界常见误判
场景NORMAL_PHOTO 或 NORMAL_VIDEO专业模式也直接套预配置
类型720P/1080P/4K/HIGH_QUALITY把 HIGH_QUALITY 固定理解成某分辨率
比例1:1、4:3、16:9忽略不同设备组合差异
门禁CanPreconfig/CanPreconfigWithRatio创建失败后才开始降级

问题为什么会发生

失败通常来自把“枚举存在”误当成“当前设备支持”。此外,预览、拍照和录像输出要来自同一次成功预配置,不能先按预配置创建预览,再混用旧通用流程的 VideoProfile。组合探测结果应绑定 cameraId、场景和系统版本,设备切换后失效。

下面的纯 TypeScript 代码是应用侧决策模型,用来验证分支和状态,不是对平台 Native API 的替代:

type Type='720p'|'1080p'|'4k'|'high';type Ratio='1:1'|'4:3'|'16:9'; type Candidate={type:Type;ratio:Ratio}; function pick(c:Candidate[],supports:(v:Candidate)=>boolean){return c.find(supports);} const chosen=pick([{type:'4k',ratio:'16:9'},{type:'1080p',ratio:'16:9'}],v=>v.type==='1080p'); if(chosen?.type!=='1080p')throw new Error('预配置降级顺序错误');

案例一:录像优先 4K,失败降到 1080P

候选顺序由业务定义,每个组合先探测,命中后一次性创建预览和录像输出。若运行阶段仍失败,释放本次会话资源并转入通用 profile 流程;不要在半初始化会话上继续追加输出。UI 展示实际命中的档位,不把用户选择的 4K 当作已经生效。

案例二:拍照页需要 1:1,录像页保持 16:9

两个页面场景不同,缓存键必须包含 NORMAL_PHOTO/NORMAL_VIDEO 和比例。切页时先停止旧会话再建立新会话,不能复用上一个页面的探测结果。高质量预配置也不等于固定像素尺寸,裁剪框应根据实际输出信息计算。

平台接入骨架

下面代码只保留与本文问题直接相关的调用顺序。实际工程要按当前官方头文件、错误码和设备能力补齐,不把示意函数当成已经在本机 API 26 编译通过的产物。

Camera_PreconfigType type = PRECONFIG_4K; Camera_PreconfigRatio ratio = PRECONFIG_RATIO_16_9; if (!OH_CaptureSession_CanPreconfigWithRatio(session, type, ratio)) { type = PRECONFIG_1080P; } // 探测成功后,再使用 UsedInPreconfig 系列接口创建匹配输出。

为什么选择这套方案

预配置适合普通拍照和录像,减少 profile 查询与筛选代码;需要特殊输出组合、专业控制或预配置不支持时,回到通用能力查询流程。二者不是谁完全替代谁,而是快捷路径与完整路径。

验证矩阵

  • 4K+16:9 支持:创建同组预览和录像输出
  • 4K 不支持:按候选顺序降到 1080P
  • 设备切换:旧缓存不可复用
  • 场景切换:PHOTO/VIDEO 分开探测
  • 初始化中断:释放半成品会话后再重试

以后如何避免同类问题

以后所有相机配置都从“能力探测结果”生成,不从 UI 选项直接生成。保存请求值和实际值,日志记录 cameraId、场景、组合与错误码,避免只留下“创建失败”。

验证范围与证据边界

本文先以华为开发者官网当前文档确认能力范围、起始版本、设备差异和资源释放要求,再用纯 TypeScript 状态模型验证参数、状态转移和失败回退。状态模型能证明应用侧分支是否自洽,不能替代 HarmonyOS 7 / API 26 编译、设备能力查询、Native 链路运行或双真机协同。

当前本机 SDK 为 API 24,且没有已连接的 HDC 设备。因此文中的 API 26 平台代码属于按官方接口整理的接入骨架,不写成“本地已编译”或“真机已经跑通”。真正验收时需要记录 DevEco Studio 与 SDK 版本、设备型号、系统版本、输入文件或网络条件、接口返回值、关键日志、前后台切换、异常注入、资源释放和结果截图。涉及画质、帧率、时延、功耗或跨设备连接的结论,还要在支持该能力的设备上重复测量。

示例不会把预期结果冒充观测结果。宿主断言、API 26 编译、模拟器、云真机和实体设备分别记录;其中任一层没有证据,就明确保留为待验证项。

可复用的工程边界

页面只提交业务意图,不直接维护 Native 句柄、编码器、ImageSource、相机会话、跨设备 sessionId 或 ArkWeb 性能采样器。能力适配层负责系统接口和错误码,编排层维护状态机、超时、取消、资源预算与降级,页面订阅只读状态。这样做的价值不是多包一层,而是让重复点击、页面销毁、设备能力不同和半途失败都能回到同一套收口逻辑。

所有日志只记录阶段、配置摘要、耗时和错误码,不记录原始图片、视频帧、跨设备消息正文或用户页面内容。生产环境还需要采样、脱敏和容量限制。

上线前检查表

  • 先确认官方文档更新时间、起始 API、设备类型和系统能力,不用接口存在代替运行支持。
  • 两个案例必须覆盖不同失败机制,一个验证主链路,一个验证资源、并发、生命周期或设备差异。
  • 每个异步阶段都能取消,页面退出后不会继续回调旧页面,资源释放顺序可重复执行。
  • 失败时保留阶段和错误码,增强能力失败能回到可用基础路径,不让页面卡死或黑屏。
  • 文章中的代码、图和结论使用同一组状态名,避免示意图与实现逻辑相互矛盾。
  • 真机验收记录输入、操作、观测和环境,不用“看起来正常”作为唯一结果。

参考资料

1. 使用相机预配置

2. 2026 年 9 月开发者月刊

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询