更新记录

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*(如 changeFlashsetFlashchangeFacingsetFacing);takeVideostartVideodestroyCameradestroy
  • 抽取 shared.uts,组件事件透传 detail JSON。
  • 修复 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 同源
}

查询接口始终返回完整结构:相机未打开时 readyfalseboundCameraId 为空字符串;Web、微信和 HarmonyOS 当前不支持组件内物理超广角切换,因此 supportsUltraWidefalse

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.512
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)

隐私、权限声明

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

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

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

插件不采集任何数据

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