更新记录

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(5.06)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × × × × × × × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

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 XviewCameraViewElement = ComponentPublicInstance

export default {
  methods: {
    callCamera(action: (ref: XviewCameraViewElement) => void) {
      const cameraRef = this.$refs['cameraRef'] as XviewCameraViewElement | 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/maskSelfie.uvue

录像

// 开始录像(maxDuration 为最大时长毫秒数,0 或不传表示不限时,需手动 stopVideo)
ref.$callMethod('takeVideo', 0)

// 定时录像(10 秒后自动停止)
ref.$callMethod('takeVideo', 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(微信小程序生效)
saveToAlbum boolean false 是否保存到系统相册
grid string off 网格:off / draw_3X3 / draw_4x4 / draw_phi(Android/iOS)
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)
tapFocus boolean true 点击对焦(Android/iOS)
keyShortcut boolean false Android 物理键快捷键(音量键拍照/录像等)
shutterFeedback boolean true 拍照时是否触发快门反馈
shutterSound string '' 自定义快门音路径(空则系统默认)
vibrate boolean false 拍照时是否震动
vibrateDuration number 300 震动时长(ms)
recordSound boolean true 是否启用录像提示音
recordSoundFile string '' 录像提示音路径

多数 props 支持运行时响应;也可通过同名 change* 方法动态修改。

组件方法

通过 ref.$callMethod('methodName', ...args) 调用。组件销毁前建议调用 destroyCamera()

生命周期

方法 说明
open() 打开相机预览
reopen() 关闭后重新打开
close() 关闭预览(保留实例)
destroyCamera() 销毁相机实例与资源
isOpened() 返回预览是否已打开
openAppSettings() 跳转系统设置(权限引导,Android/iOS)

拍摄

方法 说明
takePhoto() 拍照;触发 onPictureTaken
takeVideo(maxDuration?) 开始录像;maxDuration 为最大时长(ms),0 或不传需手动 stopVideo()
stopVideo() 停止录像;触发 onVideoTakenEnd

镜头与画质

方法 说明
changeFacing(facing) 切换前/后摄
changeFlash(flash) 修改闪光灯模式
changeMode(mode) 修改拍摄模式
changePhotoFormat(format) 修改照片后缀
changeResolution(resolution) 修改分辨率
changeSaveToAlbum(save) 是否保存到相册
changeWhiteBalance(whiteBalance) 白平衡
changeHdr(hdr) HDR 开关
changeExposure(exposure) 曝光补偿(浮点数,如 ±0.1 步进)
changeAudio(audio) 录像音频开关

缩放

方法 说明
changeLinearZoom(zoom) 线性缩放 0–1
changeZoomRatio(ratio) 光学/数码变焦倍率(如 0.512
switchUltraWide() 切换超广角
resetZoom() 恢复标准主摄

预览与交互

方法 说明
changeGrid(grid, color) 网格样式与颜色
changeCorner(radius?, ratio?) 预览圆角
changePreviewRotate(degrees) 预览旋转
changeZoomGesture(enabled) 双指缩放开关
changeTapFocus(enabled) 点击对焦开关
changeTargetSize(width, height?, tolerance?) 指定目标分辨率(Android)
changeKeyShortcut(enabled) Android 物理键快捷键
changeRecordSound(enabled, soundFile) 录像提示音
changeFeedback(shutterFeedback, shutterSound, vibrate, vibrateDuration) 拍照反馈

事件

事件名以 @onXxx 绑定,e.detail 为 payload(Web/小程序部分字段可能简化)。

事件 说明
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)

权限

Android:需在宿主 manifest.json 与插件 AndroidManifest.xml 中声明相机、录音、震动及媒体读写权限。示例项目已配置。

iOS:需在宿主 Info.plist 配置相机、麦克风、相册访问说明(NSCameraUsageDescription 等)。

HarmonyOS / 微信小程序 / Web:按各平台规范申请对应权限;Web 需用户授权浏览器摄像头/麦克风。

注意事项

  1. 预览组件应置于页面底层并铺满屏幕;操作 UI 使用更高 z-index 的绝对定位层。
  2. APP 端页面若需滚动,请按 uni-app x 规范在 App 条件编译下使用 scroll-view 包裹页面内容,相机页通常全屏固定布局。
  3. takePhoto() 会依据 props shutterFeedback / shutterSound / vibrate / vibrateDuration 触发快门反馈;动态修改请同步更新 props 或在拍照前通过原生层配置。
  4. 跨页面回传拍摄结果时,示例项目使用 uni.$emit 事件总线(如 xview-camera-taken-result),可按业务自行替换。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

需要摄像头、录音、震动和媒体读写权限,用于相机预览、拍照、录像和保存媒体文件。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: