更新记录

1.0.0(2026-09-01)

  • 首次发布 Android、iOS 原生自定义相机能力,支持 uni-app 与 uni-app x。
  • 提供任意尺寸嵌入式原生预览组件和内置全屏相机 API。
  • 支持拍照、快速拍照、录像、暂停恢复、录制进度、最大时长和录像中切换摄像头后合并为单文件。
  • 支持前后摄、设备允许时的超广角、闪光灯、手电筒、点击对焦、双指缩放、代码缩放、曝光、白平衡和 HDR。
  • 支持文本、时间、位置字段、自定义字段和图片 Logo 的照片/视频水印预览与最终烧录。
  • 支持缓存、应用持久目录、系统相册和应用可写自定义目录,并提供命名冲突、原文件保留和媒体删除能力。
  • 返回客户请求配置与设备实际生效配置,不支持的能力按 nearest 或 strict 策略明确降级或失败。

平台兼容性

uni-app(4.84)

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

uni-app x(4.84)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 6.0 × ×

lizhao-camera-pro

面向 uni-app 与 uni-app x App 的原生自定义相机插件,提供任意尺寸嵌入预览、内置全屏相机、拍照、分段录像、录像中切换镜头、结构化水印和安全媒体存储。

功能特色

  • Android 使用 CameraX,iOS 使用 AVFoundation,核心能力不依赖 uni 相机组件。
  • 同时提供 <lizhao-camera-pro> 嵌入组件和 openCamera() 全屏 API。
  • 支持拍照、快速拍照、录像、暂停/恢复、最大时长和录像中切换前后摄;最终交付一个视频文件。
  • low / medium / high / uhd 会参与真实录像档位选择;最终以 appliedConfig 为准,不会把请求值冒充生效值。
  • 文本、时间、自定义字段和本地图片可预览并烧录到照片或视频;录像水印中的时间和录制时长会动态更新。
  • 支持 cache / files / album / custom 四种输出目标、同名策略、带水印时保留原文件及插件归属媒体删除。
  • 所有媒体结果都包含 requestedConfigappliedConfig,可明确识别 nearest 降级或 strict 失败。

适用场景

  • 巡检、工程留痕、工单、考勤、执法记录等需要时间或业务字段水印的拍摄。
  • 需要把原生相机嵌入表单、卡片、弹层或自定义操作界面的 App。
  • 需要暂停录像、录像中切镜头,同时仍向业务层交付单个视频文件的场景。
  • 需要把媒体安全保存到缓存、应用目录、系统相册或业务授权目录,并可按插件返回标识删除的场景。

快速开始

嵌入页面

.nvue.uvue 页面中直接使用 easycom 标签。页面可自由覆盖业务按钮,核心预览仍由原生组件提供。

<template>
  <view class="camera-box">
    <lizhao-camera-pro
      ref="camera"
      class="camera"
      mode="mixed"
      camera-position="back"
      :auto-start="true"
      @ready="onReady"
      @photo="onPhoto"
      @recordfinished="onRecordFinished"
      @error="onError"
    />
    <text @click="takePhoto">拍照</text>
  </view>
</template>

<script>
export default {
  methods: {
    takePhoto() {
      this.$refs.camera.takePhoto({
        success: (result) => console.log('照片地址', result.path, result.uri),
        fail: (error) => console.log('拍照失败', error)
      })
    },
    onReady(event) { console.log('真实能力', event.detail || event) },
    onPhoto(event) { console.log('照片事件', event.detail || event) },
    onRecordFinished(event) { console.log('视频事件', event.detail || event) },
    onError(event) { console.log('相机错误', event.detail || event) }
  }
}
</script>

内置全屏相机

所有 UTS API 都从插件根目录导入。

import { openCamera } from '@/uni_modules/lizhao-camera-pro'

openCamera({
  mode: 'mixed',
  cameraPosition: 'back',
  config: {
    videoQuality: 'high',
    outputOptions: { target: 'cache', conflictPolicy: 'rename' }
  },
  success(result) {
    console.log('媒体结果', result.path, result.uri)
    console.log('请求/生效', result.requestedConfig, result.appliedConfig)
  },
  fail(error) {
    console.log('相机失败', error.errCode, error.stage)
  },
  complete(result) {
    console.log('全屏相机已结算', result)
  }
})

核心配置

以下字段可作为组件属性,也可放入全屏 API 的 config;单次拍照或录像参数会覆盖对应字段。

参数 类型 必填 说明 默认值 可选参数
cameraPosition / position string 初始镜头 back back / front / ultraWide
mode string 拍摄模式 mixed photo / video / mixed
scaleType string 预览填充方式 fill fit / fill / centerCrop
aspectRatio string 照片目标比例 auto auto / 1:1 / 4:3 / 16:9
photoResolution object 请求照片宽高;零值表示设备选择 {width:0,height:0} { width, height }
photoQuality number JPEG 压缩质量 0.92 0~1
videoQuality string 录像档位 high low / medium / high / uhd
videoWidth number 显式录像宽度;与高度优先于档位 0 正整数或 0
videoHeight number 显式录像高度;与宽度优先于档位 0 正整数或 0
videoFrameRate number 请求帧率 0 0 或能力范围内帧率
videoBitrate number 请求码率;平台无法证明精确值时按策略处理 0 非负整数
outputFormat string 视频容器 Android 为 mp4,iOS 为 mov mp4 / mov
recordAudio boolean 是否录制声音 true true / false
maxDurationMs number 最大录像时长,零表示不限制 0 非负整数
flashMode string 拍照闪光策略 off off / on / auto / torch
torchEnabled boolean 是否开启补光灯 false true / false
zoomRatio number 请求缩放倍率 1 以能力范围为准
exposureCompensation number 曝光补偿 0 以能力范围为准
whiteBalance string 白平衡 auto auto / incandescent / fluorescent / daylight / cloudy
hdr boolean 是否请求 HDR false true / false
fallbackPolicy string 不支持请求的处理方式 nearest nearest / strict
backgroundBehavior string 录像进入后台后的处理 finish finish / cancel
outputOptions object 输出位置与命名策略 见下表 target / directory / albumName / fileName / conflictPolicy / keepOriginal
watermarkOptions object 结构化水印 关闭 enabled / items / fields / timestampFormat / opacity / scale / previewVisible / burnIntoPhoto / burnIntoVideo

outputOptions

参数 类型 必填 说明 默认值 可选参数
target string 输出目标 cache cache / files / album / custom
directory string custom 的应用可写绝对目录或已授权 URI 空字符串
albumName string 系统相册名称;平台不支持时会反映在 appliedConfig 空字符串
fileName string 不含路径分隔符的文件名 自动生成
conflictPolicy string 同名处理 rename rename / overwrite / error
keepOriginal boolean 水印实际烧录时同时保留无水印原文件 false true / false

watermarkOptions.items[]

参数 类型 必填 说明 默认值 可选参数
id string 客户侧唯一标识
type string 水印类型 text / image
text string 文本项是 文本,可使用 {timestamp}{recordingDuration}fields 中的占位符 空字符串
imagePath string 图片项是 应用可读取的本地图片路径 空字符串
anchor string 锚点 bottomRight topLeft / topRight / bottomLeft / bottomRight / center / custom
x / y number custom 时是 自定义归一化坐标 0~1
width / height number 输出画布归一化尺寸 按内容 0~1
fontSize number 文本字号 平台默认 正数
color / backgroundColor string 前景色与背景色 平台默认 #RRGGBB / #AARRGGBB
opacity number 单项透明度 1 0~1
rotation number 顺时针旋转角度 0 任意数值

插件不会主动申请定位权限。位置、项目、人员等内容请由业务侧写入 fields,再在文本中用同名占位符引用。

接入方式选择

业务需求 推荐接入 说明
页面内任意尺寸预览和完全自定义按钮 <lizhao-camera-pro> 可使用组件方法和 14 个事件控制完整流程
快速获得系统风格的全屏拍摄流程 openCamera() 插件提供关闭、拍照、录像、暂停恢复、切镜和处理进度 UI
打开前根据设备决定镜头、分辨率或帧率 getCameraCapabilities() 返回当前设备真实能力,不占用业务 Session
删除插件曾返回的文件或相册资产 组件 deleteMedia()deleteCameraMedia() 只删除插件可确认归属的媒体

增强示例

动态水印与双输出

const watermarkOptions = {
  enabled: true,
  fields: { project: '项目 A', operator: '张三' },
  items: [
    {
      id: 'business',
      type: 'text',
      text: '{project} · {operator} · {timestamp} · {recordingDuration}',
      anchor: 'bottomLeft',
      color: '#FFFFFFFF',
      backgroundColor: '#66000000',
      padding: 10
    }
  ],
  previewVisible: true,
  burnIntoPhoto: true,
  burnIntoVideo: true
}

camera.takePhoto({
  watermarkOptions,
  outputOptions: { target: 'files', keepOriginal: true, conflictPolicy: 'rename' },
  success(result) {
    console.log(result.originalPath, result.watermarkedPath)
  }
})

暂停、恢复与录像中切镜头

camera.startRecording({
  videoQuality: 'high',
  videoFrameRate: 30,
  outputOptions: { target: 'cache' },
  success(started) { console.log('逻辑录像', started.recordingId) },
  fail(error) { console.log(error) }
})

camera.pauseRecording()
camera.resumeRecording()
camera.switchCamera('front')
camera.stopRecording()

暂停时间不计入逻辑时长;切镜头会安全结束当前片段、切换输入并继续新片段,最终处理阶段合并为一个文件。

四种输出目标

const cacheOutput = { target: 'cache' }
const filesOutput = { target: 'files', fileName: 'work.jpg', conflictPolicy: 'rename' }
const albumOutput = { target: 'album', albumName: '工作留痕', conflictPolicy: 'rename' }
const customOutput = {
  target: 'custom',
  directory: '/业务已授权的可写目录',
  fileName: 'work.jpg',
  conflictPolicy: 'error'
}

完整页面请查看插件随附的 example/uniappexample/uniappx 示例。

组件 API

<lizhao-camera-pro /> 属性

参数 类型 必填 说明 默认值 可选参数
sessionId string 页面内稳定且唯一的会话标识 自动生成
cameraPosition string 初始镜头 back back / front / ultraWide
mode string 拍摄模式 mixed photo / video / mixed
autoStart boolean 挂载后自动打开 true true / false
scaleType string 预览缩放 fill fit / fill / centerCrop
aspectRatio string 目标比例 auto auto / 1:1 / 4:3 / 16:9
cornerRadius number 原生预览圆角 0 非负数
previewRotation number 预览旋转修正 0 0 / 90 / 180 / 270
flashMode string 闪光策略 off off / on / auto / torch
torchEnabled boolean 补光灯 false true / false
zoomRatio number 缩放倍率 1 能力范围内数值
exposureCompensation number 曝光补偿 0 能力范围内数值
tapToFocus boolean 点击对焦 true true / false
pinchToZoom boolean 双指缩放 true true / false
grid string 网格 off off / 3x3 / 4x4 / phi
gridColor string 网格颜色 #80FFFFFF 颜色字符串
mirrorPreview boolean 前摄预览镜像 true true / false
mirrorOutput boolean 前摄输出镜像 false true / false
orientation string 输出方向 auto auto / portrait / landscapeLeft / landscapeRight
photoResolution object 照片宽高 零值 { width, height }
photoQuality number JPEG 质量 0.92 0~1
photoFormat string 照片格式 jpg jpg / jpeg
videoQuality string 视频档位 high low / medium / high / uhd
videoWidth / videoHeight number 显式视频宽高 0 非负整数
videoBitrate number 请求码率 0 非负整数
videoFrameRate number 请求帧率 0 能力范围内数值
outputFormat string 视频容器 随平台 mp4 / mov
recordAudio boolean 录制声音 true true / false
echoCancellation boolean 请求回声消除 true true / false
noiseSuppression boolean 请求降噪 true true / false
autoGainControl boolean 请求自动增益 true true / false
maxDurationMs number 最大录像时长 0 非负整数
whiteBalance string 白平衡 auto 见核心配置
hdr boolean 请求 HDR false true / false
shutterSoundEnabled boolean 拍照提示音 true true / false
shutterSoundPath string 自定义拍照音本地路径 空字符串
recordSoundEnabled boolean 录像开始/停止提示音 true true / false
recordSoundPath string 自定义录像音本地路径 空字符串
vibrateOnCapture boolean 拍摄反馈振动 false true / false
vibrateDurationMs number 振动时长 40 0~5000
hardwareShutterEnabled boolean 音量键/媒体键快门 false true / false
backgroundBehavior string 后台录像策略 finish finish / cancel
fallbackPolicy string 能力不匹配策略 nearest nearest / strict
outputOptions object 默认输出选项 target=cache 见核心配置
watermarkOptions object 默认水印选项 关闭 见核心配置

组件方法

参数 类型 必填 说明 默认值 可选参数
open(options?) function 打开或重新打开预览 CameraOpenOptions
close() function 关闭当前预览,组件仍可再次打开
destroyCamera() function 最终释放组件资源
isOpened() function 返回是否已打开
getCapabilities() function 返回当前能力快照
takePhoto(options?) function 拍照;支持单次输出、水印和回调覆盖 CameraTakePhotoOptions
startRecording(options?) function 开始一条逻辑录像 CameraStartRecordingOptions
pauseRecording() function 暂停并结束当前临时片段
resumeRecording() function 恢复并创建新片段
stopRecording() function 停止并进入合并、水印和保存
switchCamera(position?) function 切换镜头;录像中保持同一逻辑任务 自动前后切换 back / front / ultraWide
applyFlashMode(mode) function 应用闪光策略 off / on / auto / torch
applyTorchEnabled(enabled) function 设置补光灯 true / false
applyZoomRatio(ratio) function 设置缩放倍率 能力范围内数值
applyExposureCompensation(value) function 设置曝光补偿 能力范围内数值
applyWatermark(options) function 更新预览和后续拍摄水印 CameraWatermarkOptions
focusAt(x, y) function 按预览归一化坐标对焦 0~1
deleteMedia(options) function 删除插件返回的归属媒体 path / uri / albumIdentifier

组件方法要求页面已挂载;异步结果通过传入回调和对应组件事件返回。destroyCamera() 后不要继续复用旧实例。

全屏 API

openCamera(options)

参数 类型 必填 说明 默认值 可选参数
options OpenCameraOptions 全屏相机参数
options.mode string 拍摄模式 mixed photo / video / mixed
options.cameraPosition string 初始镜头 back back / front / ultraWide
options.config CameraRequestedConfig 初始完整配置 默认配置 见核心配置
options.tapToFocus boolean 点击对焦 true true / false
options.pinchToZoom boolean 双指缩放 true true / false
options.grid string 网格 off off / 3x3 / 4x4 / phi
options.hardwareShutterEnabled boolean 硬件快门 false true / false
options.backgroundBehavior string 后台录像策略 finish finish / cancel
options.success function 用户成功完成照片或视频后触发
options.fail function 权限、取消、拍摄或处理失败后触发
options.complete function 成功或失败后触发一次

getCameraCapabilities(options)

import { getCameraCapabilities } from '@/uni_modules/lizhao-camera-pro'

getCameraCapabilities({
  position: 'back',
  success(capabilities) {
    console.log(capabilities.videoQualities, capabilities.videoResolutions)
  },
  fail(error) { console.log(error) }
})
参数 类型 必填 说明 默认值 可选参数
options.position string 查询的镜头 back back / front / ultraWide
options.success function 返回真实 CameraCapabilities
options.fail function 查询失败
options.complete function 查询完成

deleteCameraMedia(options)

import { deleteCameraMedia } from '@/uni_modules/lizhao-camera-pro'

deleteCameraMedia({
  path: result.path,
  uri: result.uri,
  albumIdentifier: result.albumIdentifier,
  success(deleted) { console.log(deleted) },
  fail(error) { console.log(error) }
})
参数 类型 必填 说明 默认值 可选参数
options.path string 插件返回的文件路径 空字符串
options.uri string 插件返回的媒体 URI 空字符串
options.albumIdentifier string 插件返回的相册资产标识 空字符串
options.success function 删除成功
options.fail function 删除失败
options.complete function 删除完成

事件

事件 返回类型 说明
ready CameraReadyEvent 原生 Session 已运行,返回 requested/appliedConfig 与真实能力
statechange CameraStateChangeEvent opening、previewing、capturing、recording、paused、switching、finalizing 等状态变化
photo CameraPhotoEvent 照片已可读取并完成交付确认
recordstart CameraRecordStartEvent 首段收到原生真实开始回调
recordprogress CameraRecordProgressEvent 约每 250ms 返回逻辑录像时长,不含暂停时间
recordpause CameraRecordPauseEvent 当前片段已结束并进入暂停
recordresume CameraRecordResumeEvent 新片段已真实开始
recordfinished CameraRecordFinishedEvent 合并、水印、保存和复读全部完成的视频结果
finalizeprogress CameraFinalizeProgressEvent merge / watermark / save / complete 阶段及 0~100 进度
camerachange CameraChangeEvent 镜头切换已完成;录像中在新片段真实开始后触发
focuschange CameraFocusChangeEvent 对焦状态和归一化坐标
zoomchange CameraZoomChangeEvent 请求倍率与实际倍率
capabilitieschange CameraCapabilitiesChangeEvent 镜头或配置变化后的真实能力
error CameraErrorEvent 统一 CameraFail;根据 stageretryable 判断是否重试

返回值

CameraMediaResult

字段 类型 说明
mediaType string photovideo
path string 文件系统路径,不适用时为空
uri string 文件或相册 URI,不适用时为空
albumIdentifier string 系统相册资产标识,不适用时为空
width / height number 最终可读媒体尺寸
durationMs number 视频逻辑时长;照片为零
sizeBytes number 最终媒体字节数
mimeType string 真实 MIME 类型
requestedConfig CameraRequestedConfig 客户本次请求配置
appliedConfig CameraAppliedConfig 设备和平台实际应用配置及 fallbackReasons
captureSourceResolution CameraSize 拍照采集源尺寸
watermarkApplied boolean 是否实际烧录水印
originalPath / originalUri string keepOriginal=true 且产生双输出时的无水印媒体
watermarkedPath / watermarkedUri string 实际烧录水印后的媒体
savedToAlbum boolean 是否保存到系统相册

调用是否被接受和媒体是否最终成功是两个阶段。录像开始由 startRecording.success / recordstart 确认,最终视频只能以 recordfinished.result 或全屏 openCamera.success 为准。

错误码

错误码 含义 说明
9081001 参数无效 类型、枚举、范围或 JSON 不合法
9081002 权限被拒绝 相机或按需麦克风权限不可用
9081003 相机不可用 平台、设备或目标镜头不可用
9081004 状态不允许 当前会话正在拍摄、切换、处理或已释放
9081005 打开失败 原生 Session、输入、输出或宿主创建失败
9081006 拍照失败 Photo/ImageCapture、解码、方向或结果复读失败
9081007 录像失败 原生片段开始、写入或结束失败
9081008 媒体处理失败 合并、水印、方向统一、转码或结果协议失败
9081009 媒体写入失败 文件或系统相册事务失败
9081010 能力不支持 strict 下请求无法精确满足
9081011 删除失败 目标不存在、非插件归属或系统删除失败
9081012 自定义位置不可访问 custom 目录/URI 不可写或未授权
9081013 用户取消 用户关闭、生命周期取消或交付被撤销
9081014 操作超时 原生步骤超过允许时间
9081015 存储不足 可用空间或安全像素预算不足

CameraFail 还包含 stageretryablesessionIdgeneration 和精简的 nativeMessage,便于定位权限、打开、拍照、录像、合并、水印、保存或删除阶段。

支持平台

平台 是否支持 说明
uni-app App Android 支持 Android 6.0 及以上;原生 CameraX 实现
uni-app App iOS 支持 原生 AVFoundation 实现
uni-app x App Android 支持 .uvue 可使用同一组件和 API 合同
uni-app x App iOS 支持 .uvue 可使用同一组件和 API 合同
Web / H5 不支持 返回明确的平台不支持错误,不伪造媒体
HarmonyOS 不支持 当前未提供可验证的原生实现
各类小程序 不支持 不使用小程序相机组件做静默降级

App 运行包必须包含本插件的原生代码。修改或升级插件后,请重新制作对应平台的自定义基座或正式包。

注意事项

  • 首次打开会请求相机权限;只有 recordAudio=true 的录像才按需申请麦克风权限;保存或删除系统相册媒体时由平台按实际操作申请相应权限。
  • nearest 会选择设备可用的最接近配置,并在 appliedConfig.fallbackReasons 说明原因;strict 无法精确满足时返回 9081010。
  • iOS 的原生录像片段通常先写为 MOV,客户请求 MP4 时在最终处理阶段转换;Android 通常直接使用 MP4。最终容器与 MIME 以结果为准。
  • custom.directory 必须是应用可写的绝对目录或已授权 URI。插件不会自行扩大目录权限,也不会覆盖无法确认归属的客户文件。
  • overwrite 只覆盖插件可确认归属的同名媒体;事务失败会恢复旧文件或撤销新媒体。不要绕过返回结果自行猜测中间文件路径。
  • keepOriginal=true 只有在水印实际烧录时才可能产生双输出;请同时检查 originalPath/originalUriwatermarkedPath/watermarkedUri
  • 暂停、恢复、切镜和最终处理均为异步状态机。按钮应依据 statechangerecordstartrecordpauserecordresumefinalizeprogress 控制,避免重复提交。
  • 完整页面用法见随插件提供的三个示例;示例中的 custom 路径需替换为业务真实获得的可写位置。

隐私、权限声明

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

相机、麦克风、相册写入与删除、振动

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

照片、视频和水印默认仅在设备端处理,不上传到插件作者服务器

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

暂无用户评论。