微信小程序中camera组件必须为页面根节点直接子元素,禁止嵌套;拍照与录像需分用不同API;相机与录音权限须分别申请并校验;缩放、闪光灯、分辨率等功能需按平台差异做兼容处理。
camera 组件必须是页面根节点的直接子元素
微信小程序平台下,<camera> 组件如果嵌套在 <view>、<scroll-view> 甚至条件编译块里,会直接不渲染或报错“组件未定义”。这不是 bug,是微信原生限制 —— 小程序的 camera 原生组件要求 dom 层级扁平。
实操建议:
- 把
<camera>放在<template>最外层,紧贴<view>根标签之下 - 需要布局控制?用
style内联样式(如width: 100%; height: 100vh;),别套容器 - App 端没这限制,但为跨平台统一,建议所有平台都按此结构写
- 真要动态显示/隐藏?用
v-if控制整个<camera>,而不是用display: none
拍照和录像不能共用同一个 context 实例
很多人写 uni.createCameraContext() 后反复调用 takePhoto() 和 startRecord(),结果录像失败或静音 —— 因为微信小程序中,cameraContext 的 startRecord() 和 takePhoto() 是互斥操作,且 startRecord() 后必须先 stopRecord() 才能再拍照,否则回调不触发。
实操建议:
- 拍照用
uni.camera.takePhoto()(推荐,更稳定) - 录像用
uni.startRecord()+uni.stopRecord()(注意:这是全局 API,不依赖 cameraContext) - 不要混用
cameraContext.takePhoto()和uni.startRecord(),尤其在 H5 或 App 端行为不一致 - 录像时长控制靠
maxDuration参数(单位秒),设为 60 即最长 1 分钟,超时自动停
权限和授权逻辑必须分 scope 处理
相机(scope.camera)和录音(scope.record)是两个独立权限。只申请了相机,录像时会静音或失败;只申请录音,<camera> 根本打不开。而且用户拒绝一次后,uni.authorize() 不会再次弹窗,必须跳转设置页。
实操建议:
- 进入相机页前,同时检查两个权限:
scope.camera和scope.record - 任一未授权,先
uni.authorize({scope: 'scope.camera'}),成功后再检查scope.record;失败则调用uni.openSetting()引导手动开启 - App 端无需
scope.record(录像音频默认可用),但小程序必须显式申请 - 权限状态缓存不可靠,每次进页面都应重新
uni.getSetting()检查
双指缩放和闪光灯在不同平台表现差异极大
微信小程序支持 device-position 切换和 flash 属性(on/off/auto),也支持双指 pinch-zoom(需开启 bindtouchstart + 手动计算 scale 并调用 cameraContext.zoom());但 H5 端根本无 zoom 接口,App 端 zoom 行为由原生 SDK 决定,iOS 和 Android 效果也不一致。
实操建议:
- 缩放功能仅在小程序平台有条件启用:用
uni.getSystemInfoSync().platform === 'devtools' || 'ios' || 'android'做平台判断,非小程序直接隐藏缩放控件 - 闪光灯控制务必加 fallback:小程序支持
flash属性,App 端需用原生插件(如uni-plugin-camera-plus),H5 则无法控制 - 分辨率(
resolution)别硬设 1920x1080:小程序只支持到1280x720,设高了降级但可能黑屏;App 端可设更高,但要考虑内存和编码耗时

















