更新记录
1.0.0(2026-08-07)
- 首发兼容模式相机组件(Android / iOS);公开 API 统一
apply* 前缀(兼容模式 iOS 桥接中 set* 会与同名 prop 的 ObjC setter 冲突,故不用 set*)
- 双轨示例:
pages/(nvue)、pagesx/(uvue)
- 修复 nvue 多词 props 须 camelCase(如
:keyShortcut),否则快捷键不生效
- 修复 Android 恢复前台后快捷键监听丢失
平台兼容性
uni-app(5.06)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
√ |
√ |
5.0 |
12 |
5.0以下 |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
uni-app x(5.06)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| √ |
√ |
5.0 |
12 |
5.0以下 |
√ |
其他
xview-camera-viewer
xview-camera-viewer 是面向 uni-app / uni-app x 的兼容模式原生相机组件,提供 Android CameraX 与 iOS AVFoundation 能力。
组件标签:<xview-camera-viewer />。需在 nvue(uni-app)或 uvue(uni-app x)页面中使用。Web / 微信小程序源码已预留,当前 package.json 矩阵未宣称组件可用。
能力概览
- 兼容模式组件:通过
utssdk/app-android|ios/index.vue 提供原生预览
- 统一事件回调:打开/关闭、拍照、录像进度、聚焦、缩放、状态变化与异常
- 默认插槽:可在预览层之上叠加遮罩、按钮等人机界面
- 组件布局完成后自动
open();页面 onShow 可配合 reopen() / close() 管理生命周期
基础用法
uni-app x(uvue)
<template>
<view class="page">
<xview-camera-viewer
ref="cameraRef"
class="camera-view"
facing="back"
flash="off"
photoFormat="jpg"
grid="draw_3X3"
:saveToAlbum="false"
@onPictureTaken="onPictureTaken"
@onCameraError="onCameraError"
/>
<image class="shutter" src="/static/camera/shutter.png" @click="takePhoto" />
</view>
</template>
<script lang="uts">
type CameraRef = ComponentPublicInstance
export default {
methods: {
takePhoto() {
const ref = this.$refs['cameraRef'] as CameraRef | null
ref?.$callMethod('takePhoto')
},
onPictureTaken(e: any) {
console.log('[xview-camera-viewer] picture', e.detail)
},
onCameraError(e: any) {
console.log('[xview-camera-viewer] error', e.detail)
}
}
}
</script>
uni-app(nvue)
重要:兼容模式 Android/iOS 原生组件的多词 props 在 nvue 中必须使用 camelCase(如 :keyShortcut="true"、:previewRotate="90")。
使用 kebab-case(:key-shortcut)时,编译产物仍保留连字符,无法命中 @WXComponentProp(name="keyShortcut"),属性会静默失效。
<xview-camera-viewer
ref="cameraRef"
flash="off"
:keyShortcut="true"
@onPictureTaken="onPictureTaken"
/>
this.$refs.cameraRef.takePhoto()
this.$refs.cameraRef.applyFacing('front')
this.$refs.cameraRef.applyKeyShortcut(true)
Props
| 参数 |
类型 |
默认值 |
说明 |
| mode |
string |
picture |
拍摄模式 |
| facing |
string |
back |
镜头方向:back / front |
| flash |
string |
off |
闪光灯:off / on / auto / torch |
| photoFormat |
string |
jpeg |
照片后缀:jpeg / jpg / png |
| resolution |
string |
medium |
分辨率:low / medium / high / original |
| saveToAlbum |
boolean |
false |
是否保存到系统相册 |
| grid |
string |
off |
网格:off / draw_3X3 / draw_4x4 / draw_phi |
| gridColor |
string |
#808080 |
网格线颜色 |
| whiteBalance |
string |
auto |
白平衡 |
| hdr |
string |
off |
HDR:off / on |
| audio |
string |
on |
录像音频:on / off |
| cornerRadius |
number |
0 |
预览圆角半径(px) |
| cornerRatio |
number |
0 |
预览圆角比例(0–1) |
| previewRotate |
number |
0 |
预览旋转(0/90/180/270) |
| zoomGesture |
boolean |
true |
双指缩放 |
| tapFocus |
boolean |
true |
点击对焦 |
| keyShortcut |
boolean |
false |
物理键快捷键(Android 音量键) |
| shutterFeedback |
boolean |
true |
拍照快门反馈 |
| shutterSound |
string |
'' |
自定义快门音路径 |
| vibrate |
boolean |
false |
拍照震动 |
| vibrateDuration |
number |
300 |
震动时长(ms) |
| recordSound |
boolean |
true |
录像提示音 |
| recordSoundFile |
string |
'' |
录像提示音路径 |
组件方法
通过 ref.$callMethod('methodName', ...args)(uni-app x)或 ref.methodName(...args)(uni-app nvue)调用。
兼容模式说明:与 props 同名的方法在 iOS ObjC 桥接中会与 prop setter 冲突,因此所有公开配置类方法统一使用 apply* 前缀(如 applyFacing、applyFlash、applyZoomRatio、applyTargetSize)。原生层 Manager.set* / CameraBridge.set* 为内部实现,不对外暴露。
生命周期
| 方法 |
说明 |
open() |
打开相机预览 |
reopen() |
关闭后重新打开 |
close() |
关闭预览 |
destroy() |
销毁实例与资源 |
isOpened() |
预览是否已打开 |
getCameraCapabilities() |
查询缩放/镜头能力 |
openAppSettings() |
跳转系统设置 |
拍摄
| 方法 |
说明 |
takePhoto() |
拍照 |
startVideo(maxDuration?) |
开始录像(ms,0 为手动停止) |
stopVideo() |
停止录像 |
镜头与画质
applyFacing · applyFlash · applyMode · applyPhotoFormat · applyResolution · applySaveToAlbum · applyWhiteBalance · applyHdr · applyExposure · applyAudio
缩放
applyLinearZoom · applyZoomRatio · switchUltraWide · resetZoom
预览与交互
applyGrid · applyCorner · applyPreviewRotate · applyZoomGesture · applyTapFocus · applyTargetSize · applyKeyShortcut · applyRecordSound · applyFeedback
事件
| 事件 |
说明 |
| onCamera |
相机打开 |
| onCameraOpened |
相机打开 |
| onCameraClosed |
相机关闭 |
| onPictureTaken |
拍照完成 |
| onVideoTakenStart |
开始录像 |
| onVideoTakenProgress |
录像进度 |
| onVideoTakenEnd |
录像结束 |
| onFocusStart |
开始对焦 |
| onAutoFocusStart |
自动对焦开始 |
| onFocusEnd |
对焦结束 |
| onZoomChanged |
缩放变化 |
| onCameraChange |
镜头或状态变化 |
| onCameraTakenError |
拍摄错误 |
| onCameraError |
相机错误 |
错误码
| 码 |
说明 |
| 9010001 |
操作失败 |
| 9010002 |
权限拒绝 |
| 9010003 |
能力不支持 |
| 9010004 |
设备未就绪 |