ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

折叠切换后还在用旧 cameraId:HarmonyOS 7 内外屏相机选择策略

折叠切换后还在用旧 cameraId:HarmonyOS 7 内外屏相机选择策略 折叠切换后还在用旧 cameraIdHarmonyOS 7 内外屏相机选择策略从一个真实操作开始应用启动时缓存了一个 cameraId展开、折叠或切到外屏后继续复用结果创建会话失败或预览来自错误方向。折叠设备的可用摄像头、位置和传感器信息可能随状态变化固定 ID 不是业务意图。验证边界本文依据文末列出的华为开发者官方页面整理并用可执行的 TypeScript 状态模型检查应用侧分支。当前本机只有 API 24 工具链且没有连接 HarmonyOS 7 真机因此文中的 API 26 接入片段属于按官方资料整理的接入骨架不声称已经完成 API 26 编译、真机性能测试或设备兼容认证。正式上线前必须在目标 API 26 SDK 与真实设备上补齐编译、权限、异常码和性能证据。把整条链路拆开业务真正需要的是“自拍预览、拍文档、后置高质量录像”等用途。每次拓扑变化后重新读取当前可用列表按 facing、能力和业务偏好排序得到实际 cameraId如果首选不可用走明确的降级路径并把实际选择反馈给 UI。场景一与场景二案例一外屏自拍用途是面向用户的视频预览。状态变化后重新查询符合 facing 与输出需求的相机选中后再创建会话找不到时提示切换设备姿态不偷偷改用后摄。案例二展开内屏扫描文档用途要求后摄、自动对焦和目标分辨率。候选先做能力探测无法满足时降低分辨率或关闭高级效果cameraId 只作为本次选择结果。先验证状态再接平台能力type Camera{id:string;facing:user|world;video:boolean;score:number}; function choose(rows:Camera[],facing:Camera[facing]){return rows.filter(xx.facingfacingx.video).sort((a,b)b.score-a.score)[0];} const cchoose([{id:a,facing:world,video:true,score:9},{id:b,facing:user,video:true,score:7}],user);if(c?.id!b)throw new Error(用途选择失败);方案取舍固定 cameraId 只适合当前进程、当前设备状态内的短期引用不适合作为长期偏好。保存“用户选择前摄/后摄和画质档位”每次状态变化重新解析既能适配新设备也便于解释实际降级。上线前检查验证项通过标准首选相机存在命中期望方向有可重复步骤、日志或可见结果首选相机消失重新查询而非重试旧ID有可重复步骤、日志或可见结果能力不足按业务顺序降级有可重复步骤、日志或可见结果切换中页面退出新会话不挂载有可重复步骤、日志或可见结果恢复后偏好保留但ID重新解析有可重复步骤、日志或可见结果官方资料与证据边界官方适配页指出折叠状态下相机可用性、位置和传感器信息可能变化。本文排序分数是应用策略不是系统提供的 camera 排名。1. Pura X Max 应用适配2. 折叠屏状态监听3. 2026 年 9 月开发者月刊最后留下一个可复用结论这篇文章不把“接口能调用”当成完成。真正可复用的是先确定输入契约和生命周期再把失败路径写进状态模型平台能力负责提供机制应用负责把机制变成可观察、可回退、可验证的工程链路。下一次遇到同类问题先复现和记录证据再调整实现不靠重复重试掩盖根因。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进