更新记录
1.0.2(2026-08-07)
- Android Kotlin 根包由
com.xview.camera调整为com.xview.cameraview,目录同步为com/xview/cameraview,与插件名xview-camera-view对齐
1.0.1(2026-08-07)
- 方法命名统一:
change*→set*(如changeFlash→setFlash、changeFacing→setFacing);takeVideo→startVideo,destroyCamera→destroy。 - 抽取
shared.uts,组件事件透传detailJSON。 - 修复 iOS 拍照与 HarmonyOS 编译、权限、录像问题。
- 新增
getCameraCapabilities()(含boundCameraId);优化 Android 超广角切换与逻辑多摄连续变焦。
1.0.0(2026-07-02)
新增
- 首发
xview-camera-view(Android / iOS / HarmonyOS / 微信小程序 / Web),统一 easycom 与跨平台事件。 - 方法:
open·reopen·close·destroyCamera·isOpened·openAppSettings·takePhoto·takeVideo·stopVideo·changeFacing·changeFlash·changeMode·changePhotoFormat·changeResolution·changeSaveToAlbum·changeWhiteBalance·changeHdr·changeExposure·changeAudio·changeLinearZoom·changeZoomRatio·switchUltraWide·resetZoom·changeGrid·changeCorner·changePreviewRotate·changeZoomGesture·changeTapFocus·changeTargetSize·changeKeyShortcut·changeRecordSound·changeFeedback
平台兼容性
uni-app x(5.06)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
xview-camera-view
xview-camera-view 是面向 uni-app x 的标准模式相机组件,提供 Android CameraX、iOS AVFoundation、HarmonyOS CameraKit、微信小程序内置 <camera>,以及 Web 浏览器原生摄像头能力。
仅支持 uni-app x(
.uvue+ UTS)。普通 uni-app / nvue 不在支持范围内。
能力概览
- easycom 组件:
<xview-camera-view />,放入uni_modules后无需手动注册 - 统一事件回调:打开/关闭、拍照、录像进度、聚焦、缩放、状态变化与异常
- 默认插槽:可在预览层之上叠加遮罩、按钮等人机界面(见示例「自拍遮罩」「身份证遮罩」)
- 组件挂载后自动
open();页面onShow可配合reopen()/close()管理生命周期
基础用法
组件需占满可用预览区域(建议绝对定位铺满父容器)。在 Options API 页面中,通过 ref + $callMethod 调用组件方法:
<template>
<view class="page">
<xview-camera-view
ref="cameraRef"
class="camera-view"
facing="back"
flash="off"
photo-format="jpg"
grid="draw_3X3"
:save-to-album="false"
@onPictureTaken="onPictureTaken"
@onCameraError="onCameraError"
@onCameraTakenError="onCameraTakenError"
/>
<image class="shutter" src="/static/camera/shutter.png" @click="takePhoto" />
</view>
</template>
<script lang="uts">
type CameraViewElement = ComponentPublicInstance
export default {
methods: {
callCamera(action: (ref: CameraViewElement) => void) {
const cameraRef = this.$refs['cameraRef'] as CameraViewElement | null
if (cameraRef != null) {
action(cameraRef)
}
},
takePhoto() {
this.callCamera((ref) => {
ref.$callMethod('takePhoto')
})
},
onPictureTaken(e: any) {
// Android/iOS 原生层:e.detail 含 path、width、height、isFront 等
console.log('picture taken', e.detail)
},
onCameraError(e: any) {
console.log('camera error', e.detail)
}
}
}
</script>
<style>
.page {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: #000;
}
.camera-view {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
</style>
插槽与遮罩
组件提供默认插槽,内容渲染在预览层之上,适合实现取景框、水印、操作栏:
<xview-camera-view ref="cameraRef" class="camera-view" facing="front">
<!-- 遮罩层放在插槽外同级亦可,示例项目多采用绝对定位 overlay -->
</xview-camera-view>
<view class="camera-mask">
<image src="/static/mask/touxiang.png" />
</view>
遮罩层 z-index 应低于操作按钮,避免拦截快门点击。可参考 pages/camera/mask-selfie.uvue。
示例入口
本项目为 uni-app x 示例工程,示例目录遵循 DESIGN.md:
pages/
index/index.uvue # 示例主页(导航与能力概览)
camera/*.uvue # 按功能划分的相机示例页
在 HBuilderX 运行后,首页 pages/index/index 可进入各子示例。
录像
// 开始录像(maxDuration 为最大时长毫秒数,0 或不传表示不限时,需手动 stopVideo)
ref.$callMethod('startVideo', 0)
// 定时录像(10 秒后自动停止)
ref.$callMethod('startVideo', 10000)
// 停止录像
ref.$callMethod('stopVideo')
Props
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mode | string | picture |
拍摄模式;微信小程序映射为 camera 的 normal / scanCode |
| facing | string | back |
镜头方向:back / front |
| flash | string | off |
闪光灯:off / on / auto / torch |
| photoFormat | string | jpeg |
照片后缀:jpeg / jpg / png(iOS/Android 支持转换) |
| resolution | string | medium |
分辨率:low / medium / high / original(全端生效,Web/Harmony/iOS/Android/微信) |
| saveToAlbum | boolean | false |
是否保存到系统相册 |
| grid | string | off |
网格:off / draw_3X3 / draw_4x4 / draw_phi(Android/iOS/Web/Harmony 预览层) |
| gridColor | string | #808080 |
网格线颜色 |
| whiteBalance | string | auto |
白平衡:auto / daylight / cloudy / incandescent / fluorescent(Android/iOS) |
| hdr | string | off |
HDR:off / on(Android/iOS) |
| audio | string | on |
录像音频:on / off |
| cornerRadius | number | 0 |
预览圆角半径(px) |
| cornerRatio | number | 0 |
预览圆角比例(0–1,与 radius 二选一) |
| previewRotate | number | 0 |
预览旋转角度(0/90/180/270,用于外接摄像头修正) |
| zoomGesture | boolean | true |
双指缩放(Android/iOS/Web) |
| tapFocus | boolean | true |
点击对焦(Android/iOS) |
| keyShortcut | boolean | false |
物理键快捷键(Android 音量键;Web 空格/回车拍照) |
| shutterFeedback | boolean | true |
拍照时是否触发快门反馈 |
| shutterSound | string | '' |
自定义快门音路径(空则系统默认) |
| vibrate | boolean | false |
拍照时是否震动 |
| vibrateDuration | number | 300 |
震动时长(ms) |
| recordSound | boolean | true |
是否启用录像提示音 |
| recordSoundFile | string | '' |
录像提示音路径 |
多数 props 支持运行时响应;也可通过同名 set* 方法动态修改。
组件方法
通过 ref.$callMethod('methodName', ...args) 调用。组件销毁前建议调用 destroy()。
生命周期
| 方法 | 说明 |
|---|---|
open() |
打开相机预览 |
reopen() |
关闭后重新打开 |
close() |
关闭预览(保留实例) |
destroy() |
销毁相机实例与资源 |
isOpened() |
返回预览是否已打开 |
getCameraCapabilities() |
返回当前朝向的缩放范围、当前倍率、变焦/超广角支持状态与可枚举镜头列表;未就绪或不支持时返回默认字段,不触发错误事件 |
openAppSettings() |
跳转系统设置(权限引导,Android/iOS) |
getCameraCapabilities() 建议在 onCameraOpened 后调用,返回:
{
facing: 'front' | 'back',
ready: boolean,
boundCameraId: string, // 当前实际绑定的镜头 id;Android 为 Camera2 cameraId
minZoomRatio: number,
maxZoomRatio: number,
linearZoom: number,
zoomRatio: number,
supportsZoom: boolean,
supportsUltraWide: boolean,
lenses: LensInfo[] // Android:仅 CameraX 可 bind 镜头,与 boundCameraId 同源
}
查询接口始终返回完整结构:相机未打开时 ready 为 false、boundCameraId 为空字符串;Web、微信和 HarmonyOS 当前不支持组件内物理超广角切换,因此 supportsUltraWide 为 false。
Android:lenses 仅包含默认逻辑镜头组与 switchUltraWide() 的 rebind 目标(与 boundCameraId 切换一致),不会列出其它 back-facing CameraInfo 中的 physical id(如华为 id=8)。请用 boundCameraId 判断当前预览实际绑定的镜头。
拍摄
| 方法 | 说明 |
|---|---|
takePhoto() |
拍照;触发 onPictureTaken |
startVideo(maxDuration?) |
开始录像;maxDuration 为最大时长(ms),0 或不传需手动 stopVideo() |
stopVideo() |
停止录像;触发 onVideoTakenEnd |
镜头与画质
| 方法 | 说明 |
|---|---|
setFacing(facing) |
切换前/后摄 |
setFlash(flash) |
修改闪光灯模式 |
setMode(mode) |
修改拍摄模式 |
setPhotoFormat(format) |
修改照片后缀 |
setResolution(resolution) |
修改分辨率 |
setSaveToAlbum(save) |
是否保存到相册 |
setWhiteBalance(whiteBalance) |
白平衡 |
setHdr(hdr) |
HDR 开关 |
setExposure(exposure) |
曝光补偿(浮点数,如 ±0.1 步进) |
setAudio(audio) |
录像音频开关 |
缩放
| 方法 | 说明 |
|---|---|
setLinearZoom(zoom) |
线性缩放 0–1 |
setZoomRatio(ratio) |
光学/数码变焦倍率(如 0.5、1、2) |
switchUltraWide() |
切换超广角 |
resetZoom() |
恢复标准主摄 |
预览与交互
| 方法 | 说明 |
|---|---|
setGrid(grid, color) |
网格样式与颜色 |
setCorner(radius?, ratio?) |
预览圆角 |
setPreviewRotate(degrees) |
预览旋转 |
setZoomGesture(enabled) |
双指缩放开关 |
setTapFocus(enabled) |
点击对焦开关 |
setTargetSize(width, height?, tolerance?) |
指定目标分辨率(Android/iOS/Harmony/Web) |
setKeyShortcut(enabled) |
物理键快捷键(Android/Web;iOS/微信/Harmony 返回 9010003) |
setRecordSound(enabled, soundFile) |
录像提示音 |
setFeedback(shutterFeedback, shutterSound, vibrate, vibrateDuration) |
拍照反馈 |
事件
事件名以 @onXxx 绑定,e.detail 为 payload;五端字段名已对齐 Android(path/width/height/duration、zoom 四元组、progress 时间字段)。
平台能力矩阵(硬限制)
| 能力 | Android | iOS | Harmony | Web | 微信 |
|---|---|---|---|---|---|
| 组件内录像 stopVideo | ✓ | ✓ | ✓ | ✓ | ✓ |
| setZoomRatio / setLinearZoom | ✓ | ✓ | ✓ | 浏览器支持时 | setZoom |
| switchUltraWide | ✓ | ✓ | 9010003 | 9010003 | 9010003 |
| getCameraCapabilities | 完整镜头/缩放 | 完整镜头/缩放 | 仅缩放 | 仅数码变焦 | 仅数码变焦 |
| setFlash | ✓ | ✓ | ✓ | 9010003 | camera prop |
| setExposure / setWhiteBalance / setHdr | ✓ | ✓ | 部分 9010003 | 9010003 | 9010003 |
| setTapFocus | ✓ | ✓ | 需触摸接入 | 9010003 | 9010003 |
| setKeyShortcut | ✓ 音量键 | 9010003 | 9010003 | 空格/回车 | 9010003 |
不支持的能力统一通过 onCameraError 返回错误码 9010003(能力不支持)或 9010004(设备未就绪),不会再用空 stub 或伪成功 onCameraChange。
| 事件 | 说明 |
|---|---|
| onCamera | 相机通用事件(打开时与 onCameraOpened 同时触发) |
| onCameraOpened | 相机打开 |
| onCameraClosed | 相机关闭 |
| onPictureTaken | 拍照完成 |
| onVideoTakenStart | 录像开始 |
| onVideoTakenProgress | 录像进度 |
| onVideoTakenEnd | 录像完成 |
| onFocusStart / onAutoFocusStart | 开始对焦 |
| onFocusEnd | 对焦结束 |
| onZoomChanged | 缩放变化 |
| onCameraChange | 参数变更或状态提示 |
| onCameraTakenError | 拍摄失败(拍照/录像) |
| onCameraError | 相机打开或运行异常 |
常用 payload 字段
onCameraOpened(Android/iOS)
| 字段 | 类型 | 说明 |
|---|---|---|
| facing | string | 当前镜头 front / back |
| physicalCameraId | string | 物理镜头 ID(可选) |
| cameraId | string | 逻辑相机 ID(可选) |
onPictureTaken(Android/iOS)
| 字段 | 类型 | 说明 |
|---|---|---|
| path | string | 本地文件路径 |
| uri | string | 相册 URI(保存到相册时) |
| isFront | boolean | 是否前置拍摄 |
| width / height | number | 图片宽高 |
| rotation | number | 旋转角度 |
onVideoTakenStart
| 字段 | 类型 | 说明 |
|---|---|---|
| path | string | 录像临时路径 |
| elapsed | number | 已录制毫秒 |
| timeText | string | 格式化时间文本 |
| duration | number | 最大时长(ms) |
onVideoTakenProgress
| 字段 | 类型 | 说明 |
|---|---|---|
| elapsed / duration / seconds | number | 进度相关 |
| timeText | string | 格式化时间 |
onVideoTakenEnd
| 字段 | 类型 | 说明 |
|---|---|---|
| path | string | 视频文件路径 |
| uri | string | 相册 URI(可选) |
| duration | number | 视频时长 |
| size | number | 文件大小(字节) |
| suffix | string | 视频后缀 |
onFocusStart / onFocusEnd
| 字段 | 类型 | 说明 |
|---|---|---|
| x / y | number | 归一化坐标 0–1 |
| success | boolean | 对焦是否成功(onFocusEnd) |
onZoomChanged
| 字段 | 类型 | 说明 |
|---|---|---|
| minZoomRatio / maxZoomRatio | number | 变焦范围 |
| linearZoom | number | 线性缩放 0–1 |
| zoomRatio | number | 当前变焦倍率 |
onCameraTakenError / onCameraError
| 字段 | 类型 | 说明 |
|---|---|---|
| message | string | 错误描述 |
| code | number | 错误码 |
| action | string | 触发动作(takeError) |
| isRecording / isCapturing | boolean | 繁忙状态(takeError) |

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 42
赞赏 0
下载 12511312
赞赏 1943
赞赏
京公网安备:11010802035340号