更新记录
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 四种输出目标、同名策略、带水印时保留原文件及插件归属媒体删除。
- 所有媒体结果都包含
requestedConfig 与 appliedConfig,可明确识别 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/uniapp 与 example/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;根据 stage 与 retryable 判断是否重试 |
返回值
CameraMediaResult
| 字段 |
类型 |
说明 |
| mediaType |
string |
photo 或 video |
| 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 还包含 stage、retryable、sessionId、generation 和精简的 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/originalUri 与 watermarkedPath/watermarkedUri。
- 暂停、恢复、切镜和最终处理均为异步状态机。按钮应依据
statechange、recordstart、recordpause、recordresume 和 finalizeprogress 控制,避免重复提交。
- 完整页面用法见随插件提供的三个示例;示例中的
custom 路径需替换为业务真实获得的可写位置。