Taro Camera 相机组件完全指南:API 属性、事件回调与 H5 端降级机制
Taro Camera 相机组件完全指南API 属性、事件回调与 H5 端降级机制【免费下载链接】taro开放式跨端跨框架解决方案支持使用 React/Vue/Nerv 等框架来开发微信/京东/百度/支付宝/字节跳动/ QQ 小程序/H5/React Native 等应用。 https://taro.zone/项目地址: https://gitcode.com/NervJS/taroTaro 的Camera相机组件taro-camera用于在微信、支付宝、百度、字节跳动、QQ、京东小程序及 React Native 等端上调用系统相机支持拍照、录像与扫码两种模式。本文以 camera 组件文档 为核心骨架结合仓库中的组件实现、类型定义与测试用例完整讲解其属性、事件、端能力差异以及 H5 端的特殊降级行为帮助你在 Taro 项目中正确、稳健地使用相机能力。一、组件概览与文档骨架Camera组件在 Taro 组件库中归属于 media媒体分类官方定位为「系统相机」对应小程序原生组件 camera。其文档位于 packages/taro-components/src/components/camera/readme.md文档以 API 表格的形式给出了两个核心属性与两个事件这是该组件最小可用的接口面是否支持属性类型默认值说明√device-positionStringback前置或后置值为 front, back√bindstopEventHandle摄像头在非正常终止时触发如退出后台等情况√binderrorEventHandle用户不允许使用摄像头时触发其中device-position控制摄像头朝向bindstop与binderror是组件暴露的两个事件回调。需要说明的是该文档由 StencilJS 自动生成工具标注!-- Auto Generated Below --属性表较为精简而组件真正的完整接口定义含mode、resolution、flash、frameSize等维护在 types/Camera.d.ts 中下文将逐项展开。二、完整属性定义与取值说明仓库中 types/Camera.d.ts 定义了CameraProps的完整接口它继承自StandardProps通用的事件与样式属性。相比 readme 表格类型定义补充了更多可用于实战的属性属性类型默认值支持端说明modenormal \| scanCodenormalweapp, alipay, tt, qq, jd, rn相机模式普通拍照 / 扫码resolutionlow \| medium \| highmediumweapp, tt, ascf分辨率不支持动态修改devicePositionfront \| backbackweapp, alipay, swan, tt, qq, jd, rn, ascf摄像头朝向flashauto \| on \| off \| torchautoweapp, alipay, swan, tt, qq, jd, rn, ascf闪光灯模式torch为常亮frameSizesmall \| medium \| largemediumweapp, alipay, tt期望的相机帧数据尺寸outputDimension360P \| 540P \| 720P \| 1080P \| max720Palipay拍照、录制的分辨率支付宝独有2.1 device-position前置/后置切换readme 表格中的device-position在类型定义中对应devicePosition属性合法值为front前置与back后置默认back。在 JSX / Vue 模板中书写时使用 kebab-case 形式例如Camera devicePositionfront /2.2 mode普通模式与扫码模式mode默认为normal当设置为scanCode时相机进入扫码识别模式此时配合onScanCode事件即可实现一维码/二维码识别能力详见下文事件小节。2.3 resolution 与 frameSizeresolution控制拍摄分辨率取值为low/medium/high默认medium且不支持动态修改需要在组件初始化前确定frameSize指定期望的相机帧数据尺寸small/medium/large用于帧数据相关能力的预估。2.4 flash闪光灯控制flash支持四个合法值auto自动、on打开、off关闭、torch常亮默认auto。这里注意与部分平台如支付宝的属性命名差异Taro 统一收敛为flash并做了跨端映射。2.5 outputDimension支付宝专有分辨率outputDimension是支付宝平台独有属性用于指定相机拍照、录制的输出分辨率可选360P、540P、720P、1080P、max默认720P。跨端开发时建议对该属性做条件编译或忽略避免在非支付宝端引发告警。三、事件回调bindstop / binderror 及其完整事件族readme 表格给出了两个事件分别对应「摄像头非正常终止」与「用户不允许使用摄像头」。在 Taro 的 React / Vue 写法中小程序原生的bind前缀事件统一映射为on开头的回调属性。类型定义 types/Camera.d.ts 展示了完整的事件族事件原生 bind 形式React/Vue 回调触发时机bindstoponStop摄像头非正常终止时触发如退出后台等情况binderroronError用户不允许使用摄像头时触发—onInitDone相机初始化完成时触发weapp, tt, rn, ascf—onReady相机初始化成功时触发alipay—onScanCode成功识别到一维码时触发仅在modescanCode时生效weapp, alipay, tt, qq, rn3.1 事件回调的 detail 数据onInitDone的事件 detail 包含maxZoom最大变焦值可用于初始化后动态设置变焦onScanCode的事件 detail 包含charSet字符集、type码类型、result识别结果在微信端还提供rawData原始数据在支付宝端提供fullResult完整识别结果。3.2 实战示例扫码模式import { Camera } from tarojs/components export default function ScanPage () { return ( Camera modescanCode devicePositionback onScanCode{(e) { const { result, type } e.detail console.log(识别结果, result, 码类型, type) }} onError{() { console.warn(用户未授权摄像头) }} onStop{() { console.log(摄像头被非正常终止) }} / ) }四、H5 端实现原生相机不可用的降级机制与普通 DOM 组件不同Camera在小程序端是原生组件H5 浏览器无法直接复用其能力。仓库中的 H5 实现 camera.tsx 清晰地展示了这一点该组件基于 StencilJS 注册为taro-camera-core标签但在componentDidLoad生命周期中直接调用了notSupport(Camera, this)Component({ tag: taro-camera-core }) export class Camera implements ComponentInterface { componentDidLoad () { notSupport(Camera, this) } render () { return ( Host / ) } }notSupport定义在 packages/taro-components/src/utils/helper.tsexport function notSupport (name , instance {}) { console.error(H5 暂不支持 ${name} 组件) Taro.eventCenter.trigger(__taroNotSupport, { name, instance, type: component, category: temporarily, }) }这段代码揭示了两个关键信息控制台告警在 H5 端渲染Camera时控制台会输出H5 暂不支持 Camera 组件的错误信息全局事件通知同时通过Taro.eventCenter触发__taroNotSupport事件事件 payload 中携带组件名、组件实例、类型component与分类temporarily表示暂时性不支持开发者可以监听该事件做全局降级提示或埋点。对应的单元测试 camera.spec.tsx 也验证了这一行为测试用newSpecPage渲染taro-camera-core /后断言渲染结果为空标签且console.error被调用并输出了未实现警告printUnimplementedWarning。工程结论Camera组件适用于小程序weapp、alipay、swan、tt、qq、jd、ascf与 React Native 端在 H5 端调用时组件不会渲染任何可见 UI需要业务侧自行判断运行环境并提供替代方案例如引导用户授权后使用Taro.chooseImage/Taro.scanCode等 API 能力。五、组件注册与导入方式Camera组件通过 components/index.ts 统一导出类型声明在 types/index.vue3.d.ts 与 types/index.solid.d.ts 中分别映射为 Vue 3 与 Solid 的组件类型。三种框架下的导入方式// React import { Camera } from tarojs/components // Vue 3自动全局注册或按需引入 template Camera modenormal :devicePositionback / /template // Solid import { Camera } from tarojs/components组件内部实现与类型导出均位于packages/taro-components而各小程序平台weapp、alipay、swan 等的编译产物由 taro-platform-weapp 等平台包负责将Camera映射为对应平台的原生camera标签。六、跨端使用建议与权限注意综合文档与源码跨端使用Camera时建议遵循以下几点权限先行小程序端调用相机需用户授权scope.camera若用户拒绝会触发onError回调业务侧应据此引导重新授权识别环境H5 端组件不渲染且会输出告警上线前务必做端能力判断如process.env.TARO_ENV或监听__taroNotSupport事件统一处理动态属性限制resolution不支持动态修改切换分辨率需要重新挂载组件平台差异收敛outputDimension仅支付宝支持onReady仅支付宝支持onInitDone在微信/字节/RN/ASCF 端可用跨端代码应对这些差异化属性做条件处理扫码场景需要识别一维码/二维码时设置modescanCode并通过onScanCode的e.detail.result获取识别结果。七、源码阅读指引如需深入理解该组件的实现与类型可在仓库中按以下路径查阅组件文档camera/readme.mdH5 实现含 notSupport 降级camera/camera.tsx组件导出入口camera/index.ts完整类型定义与事件 detailtypes/Camera.d.ts未实现告警逻辑utils/helper.ts行为验证测试tests/camera.spec.tsx【免费下载链接】taro开放式跨端跨框架解决方案支持使用 React/Vue/Nerv 等框架来开发微信/京东/百度/支付宝/字节跳动/ QQ 小程序/H5/React Native 等应用。 https://taro.zone/项目地址: https://gitcode.com/NervJS/taro创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考