更新记录
1.0.0(2026-11-03)
- 新增 module 方式无预览拍照:前后摄像头、画质档位
quality(uhd/fhd/hd/sd)、jpegQuality压缩质量、自定义文件名 / 目录、可选 base64 输出 - 新增 module 方式无预览录像:开始 / 结束录制,画质档位
quality(uhd/fhd/hd/sd)、可选录音、自定义文件名 / 目录 - 新增
isRecording判断当前是否正在录像 - 新增
deleteFile删除指定图片 / 视频文件 - 新增
getSupportedSizes查询摄像头支持的画质档位,按像素总数从大到小排列,quality可直接传给takePhoto/startRecord - 新增
requestPermission相机(可选录音)运行时权限申请 - 新增 component 方式(nvue)
zy-camera-view:内嵌预览 + 预览拍照 / 预览录像 / 前后摄像头切换 / 闪光灯(off、on、auto、torch) - 预览画面等比显示,不变形、不裁剪,比例不一致时四周留空
- 支持通过
onEvent接收原生事件:ready/takePhoto/startRecord/stopRecord/switchCamera/flash/error - 输出目录为 App 外部存储目录
Android/data/<包名>/files/zy-camera(外部存储不可用时回退内部filesDir) - 仅支持 Android,运行与调试需使用自定义基座
平台兼容性
uni-app(4.72)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-vue插件版本 | app-nvue | app-nvue插件版本 | Android | Android插件版本 | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | × | × | √ | 1.0.0 | √ | 1.0.0 | 6.0 | 1.0.0 | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | - | × | × |
uni-app x(4.72)
| Chrome | Safari | Android | Android插件版本 | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|---|
| - | - | 6.0 | 1.0.0 | - | - | - |
插件介绍
Android 相机 UTS 插件。同时提供两种引用方式:module 方式支持无预览拍照、无预览录像与删除指定图片;component 方式(nvue)支持在页面上内嵌相机预览并完成拍照、录像、前后摄像头切换与闪光灯控制。支持 uni-app(vue / nvue 页面)。
使用场景
- 页面需要静默抓拍(考勤、巡检、取证),不能出现取景画面,由 module 直接返回图片路径或 base64
- 后台记录现场视频片段,不需要用户看到预览画面
- nvue 页面需要一块内嵌取景区域,由用户自行构图后拍照 / 录像
- 业务流程结束后清理本次产生的图片、视频文件
使用流程
- 申请权限:
requestPermission({ audio }, callback)申请相机权限(录像收音时同时申请录音权限)。 - 无预览拍照:
takePhoto({ front, quality, jpegQuality, base64 }, callback)(quality为画质档位),成功后取data.path/data.base64。 - 无预览录像:
startRecord({ front, quality, audio }, callback)开始录制(quality为画质档位)→ 业务处理 →stopRecord(callback)结束并取视频路径与时长。 - 预览拍摄(nvue):页面放置
<zy-camera-view>组件 → 收到ready事件后调用组件方法takePhoto/startRecord/stopRecord,结果统一从onEvent事件取。 - 删除文件:
deleteFile({ path }, callback)删除指定图片 / 视频。
用法
import {
requestPermission,
takePhoto,
startRecord,
stopRecord,
deleteFile,
isRecording
} from '@/uni_modules/zy-camera'
申请相机权限
requestPermission({
audio: false, // 是否同时申请录音权限,默认 false
success: (res) => {
console.log(res.granted, res.audioGranted)
},
fail: (err) => {
console.log(err.errCode, err.errMsg)
}
})
无预览拍照
takePhoto({
front: false, // true 使用前置摄像头,默认 false(后置)
quality: 'fhd', // 画质档位:'uhd' | 'fhd' | 'hd' | 'sd',不传则取最大 JPEG 尺寸
jpegQuality: 95, // JPEG 压缩质量 1~100,默认 95
base64: false, // 是否在结果中附带 base64,默认 false
fileName: '', // 文件名,可带或不带 .jpg,默认按时间戳生成
dir: '', // 保存目录绝对路径,默认 App 外部存储目录/zy-camera/photo
success: (res) => {
console.log(res.path, res.size, res.width, res.height)
},
fail: (err) => {
console.log(err.errCode, err.errMsg)
}
})
默认保存目录为 App 外部存储目录
/storage/emulated/0/Android/data/<包名>/files/zy-camera/photo(应用专属外部存储,无需存储权限);外部存储不可用时自动回退到内部filesDir。
无预览录像
startRecord({
front: false,
quality: 'fhd', // 画质档位:'uhd' | 'fhd' | 'hd' | 'sd',默认 'fhd'
audio: false, // true 需要录音权限
success: (res) => {
// 只表示"已开始",此时文件还没有内容,路径要等 stopRecord
console.log(res.msg)
}
})
// 业务处理结束后结束录制
stopRecord({
success: (res) => {
console.log(res.path, res.duration, res.size)
},
fail: (err) => {
console.log(err.errCode, err.errMsg)
}
})
// 当前是否正在录制
console.log(isRecording())
删除指定图片 / 视频
deleteFile({
path: imagePath, // 支持 file:// 前缀
success: (res) => {
console.log(res.deleted, res.path)
},
fail: (err) => {
console.log(err.errCode, err.errMsg)
}
})
查询设备支持的画质档位
返回该摄像头实际支持的档位(uhd / fhd / hd / sd),width / height 是各档位的标准分辨率,quality 可直接传给 takePhoto / startRecord:
getSupportedSizes({
front: false, // 查询前置摄像头传 true
success: (res) => {
// res.list 按像素总数从大到小排列,可直接取 res.list[0] 作为最高画质
// 示例:[{ quality:'uhd', width:3840, height:2160 }, { quality:'fhd', width:1920, height:1080 }, ...]
console.log(res.list)
},
fail: (err) => {
console.log(err.errCode, err.errMsg)
}
})
该方法只读取摄像头能力信息,不打开相机、不占用相机资源,也不会与预览 / 录制冲突。
nvue 页面内嵌预览相机
组件默认全局注册,直接使用标签。必须指定明确宽高,否则原生画面无法渲染。
画面等比显示:完整、不变形、不裁剪,与组件比例不一致时四周留空;前后摄像头切换时镜像与方向自动纠正。
插件(组件与 module 方式均)必须使用自定义基座运行与打包。
<zy-camera-view
ref="camera"
style="width:750rpx;height:420px"
:front="false"
flash="off"
@onEvent="onEvent"
/>
onEvent(e) {
const detail = e.detail // { type, code, msg, dataJson }
const data = JSON.parse(detail.dataJson || '{}')
if (detail.code != 0) {
console.log('失败:' + detail.type + ' ' + detail.code + ' ' + detail.msg)
return
}
// type 取值:ready / takePhoto / startRecord / stopRecord / switchCamera / flash / error
}
// 组件方法
this.$refs.camera.start({ front: true, flash: 'off' })
this.$refs.camera.takePhoto({ quality: 'fhd', jpegQuality: 95, base64: false })
this.$refs.camera.startRecord({ quality: 'fhd', audio: false })
this.$refs.camera.stopRecord()
this.$refs.camera.switchCamera()
this.$refs.camera.setFlashMode('torch')
this.$refs.camera.stop()
闪光灯方法名为
setFlashMode(off/on/auto/torch),不能写成setFlash,会与组件属性flash冲突。
插件方法
| 方法 | 说明 | 回调 |
|---|---|---|
requestPermission(options) |
申请相机(可选录音)运行时权限 | 成功 data.granted / data.audioGranted |
takePhoto(options) |
无预览拍照,可指定前后摄像头、画质档位、JPEG 压缩质量与 base64 | 成功 data.path / data.base64 等 |
startRecord(options) |
开始无预览录像 | 成功仅表示"已开始"(code / msg),文件信息由 stopRecord 返回 |
stopRecord(options) |
结束无预览录像 | 成功 data.path / data.duration / data.size |
deleteFile(options) |
删除指定图片 / 视频文件 | 成功 data.deleted 表示本次是否真的删除 |
getSupportedSizes(options) |
查询指定摄像头支持的画质档位,按像素总数降序 | 成功 data.list 为 [{ quality, width, height }] |
isRecording() |
当前是否正在无预览录像(同步返回 boolean) | 无回调 |
组件方法
| 方法 | 说明 | 结果事件 |
|---|---|---|
start(options) |
开始预览,options.front / options.flash |
ready |
stop() |
停止预览并释放相机 | 无 |
takePhoto(options) |
预览拍照,options.quality 为画质档位(uhd / fhd / hd / sd)、options.jpegQuality 为压缩质量、options.base64 控制是否回传 base64 |
takePhoto |
startRecord(options) |
预览录像,options.quality 为画质档位(uhd / fhd / hd / sd),options.audio 控制是否录音 |
startRecord |
stopRecord() |
结束预览录像 | stopRecord |
switchCamera() |
切换前后摄像头 | switchCamera |
setFlashMode(mode) |
设置闪光灯 off / on / auto / torch |
flash |
release() |
释放全部资源 | 无 |
回调结果结构(module)
// takePhoto 成功回调 res
{
code : 1, // 恒为 1
msg : '拍照成功', // 描述信息
path : '', // 图片文件绝对路径
name : '', // 文件名(含后缀)
size : 0, // 文件大小(字节)
width : 0, // 图片实际宽度(像素)
height : 0, // 图片实际高度(像素)
base64 : '' // 传 base64:true 时为 data:image/jpeg;base64,...,否则空串
}
// startRecord 成功回调 res(开始录制不返回文件信息,此刻文件还没有内容)
{
code : 1,
msg : '录制已开始'
}
// stopRecord 成功回调 res
{
code : 1,
msg : '录像已结束',
path : '',
name : '',
size : 0, // 文件大小(字节)
duration : 0 // 录制时长(毫秒)
}
// deleteFile 成功回调 res
{
code : 1,
msg : '文件已删除',
path : '', // 已去掉 file:// 前缀的路径
deleted : true // true=本次确实删除,false=文件本来就不存在
}
// getSupportedSizes 成功回调 res
{
code : 1,
msg : '共 3 档画质',
front : false, // 实际查询的朝向
list : [ // 按像素总数降序
{ quality : 'uhd', width : 3840, height : 2160 },
{ quality : 'fhd', width : 1920, height : 1080 },
{ quality : 'hd', width : 1280, height : 720 }
]
}
// 失败回调 err(UniError)
{
errSubject : 'zy-camera',
errCode : 9200002, // 见错误码表
errMsg : '未获得相机权限'
}
事件结构(component)
// onEvent 的 e.detail
{
type : 'takePhoto', // ready / takePhoto / startRecord / stopRecord / switchCamera / flash / error
code : 0, // 0 表示成功,非 0 为错误码
msg : '拍照成功', // 描述信息
dataJson : '{}' // 具体数据 JSON 字符串,需自行 JSON.parse
}
// dataJson 解析后的字段
// ready : { front : false, width : 1280, height : 720, flash : 'off' }
// takePhoto : { path : '', name : '', size : 0, width : 0, height : 0, base64 : '' }
// startRecord : {}(开始录制不回文件信息)
// stopRecord : { path : '', name : '', size : 0, duration : 0 }
// switchCamera : { front : true }
// flash : { flash : 'torch' }
// error : {}
错误码
| 错误码 | 说明 |
|---|---|
| 9200001 | 无法获取当前应用环境 |
| 9200002 | 未获得相机 / 录音权限 |
| 9200003 | 相机不可用(未找到摄像头、打开失败或被占用) |
| 9200004 | 拍照失败(含 12 秒未返回图像的超时) |
| 9200005 | 录像启动失败 |
| 9200006 | 录像停止失败(未在录制、录制时间过短或输出文件无效) |
| 9200007 | 文件不存在 |
| 9200008 | 文件删除失败 |
| 9200009 | 参数不合法 |
| 9200010 | 当前状态不允许该操作(正在拍照 / 正在录制) |
权限说明
| 权限 | 用途 |
|---|---|
android.permission.CAMERA |
拍照、预览与录像 |
android.permission.RECORD_AUDIO |
录像录音,仅在 audio: true 时使用 |

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