更新记录

1.0.7(2026-07-09)

  • iOS ready 事件修复

1.0.6(2026-07-09)

修复预设前后摄不生效的问题,因参数名冲突有变化请了解

1.0.4(2026-07-08)

删除 android 默认的录音权限配置

查看更多

平台兼容性

uni-app(4.71)

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

uni-app x(4.71)

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

自定义相机 fsyang-camera

原生 CameraX(Android) / AVFoundation(iOS) 封装的自定义相机组件 <fsyang-camera>。 预览自适应任意容器、所见即所得、横竖方向自动跟随。Android + iOS 双端一致,uni-app(vue3 / nvue) 通用。

特性

  • 预览自适应:放进任意大小的盒子都不变形,所见即所得(成片 = 预览可视区)
  • 拍照:自定义成片宽度(自动选传感器分辨率)/ 按比例裁剪 / 实时水印 / EXIF·GPS 开关 / 无声拍照
  • 录像:按设备真实档位(4K / 1080P / 720P)+ 帧率 + 音频开关 + 自动取封面
  • 专业控制:曝光补偿 / 变焦 / 点按对焦 / 两指缩放 / 闪光(关·开·自动·常亮) / 前后摄切换
  • 能力一次给全@ready 回传变焦范围、曝光档、是否有闪光灯、拍照上限、录像真实档位
  • 权限独立申请:相机 / 麦克风 / 定位 各自按需

快速开始

1. 放置组件(铺满或任意容器都可)

<template>
  <view style="flex:1">
    <fsyang-camera
      ref="cam"
      style="position:absolute;left:0;top:0;right:0;bottom:0;"
      :mode="mode"
      :cameraPosition="position"
      :flash="flash"
      :photoWidth="1080"
      @ready="onReady"
      @captured="onCapture"
      @error="onError"
    />
  </view>
</template>

nvue 中自定义原生组件 flex:1 不会被撑开,请用绝对定位铺满父容器。

2. 申请权限并拍照

export default {
  data() { return { mode: 'photo', position: 'back', flash: 'off' } },
  mounted() {
    // 默认只申请相机权限;需要录像收声时,再按需申请 microphone
    this.$refs.cam.requestPermission('camera')
  },
  methods: {
    shot() { this.$refs.cam.takePhoto() },          // 拍照
    onReady(e) { /* this.parse(e) 为设备能力 */ },
    onCapture(e) {
      const d = this.parse(e)                        // { path, width, height, size, ... }
      console.log('拍到', d.path)
    },
    onError(e) { console.log(this.parse(e).message) },
    // 事件 payload 双端统一解析(字符串 / 对象 / Map 都兼容)
    parse(e) {
      let d = (e != null && e.detail != null) ? e.detail : e
      if (typeof d === 'string') { try { d = JSON.parse(d) } catch (x) { d = {} } }
      return d || {}
    }
  }
}

Props

属性 类型 默认 说明
mode String photo 工作模式:photo 拍照 / video 录像
cameraPosition String '' 镜头:back 后置 / front 前置(推荐使用,避免与 nvue 样式字段混淆)
flash String off 闪光:off / on / auto / torch(常亮手电)
photoWidth Number 1080 成片宽度(px),自动选分辨率;0 = 原图
zoom Number 1 变焦倍数(范围以 @ready 为准)
exposure Number 0 曝光补偿档(范围以 @ready 为准)
grid Boolean false 九宫格辅助线
crop String '' 裁剪,JSON 串 {"x":0,"y":0,"w":1,"h":1}(0~1 相对预览可视区);空串 = 不裁
cropBox Boolean true 裁剪取景框:true=裁剪开启时显示绿色取景框;false=静默裁剪不显框(仅 crop 开启时有意义)
watermark String '' 水印,JSON 串 {"on":true,"time":true,"date":true,"week":true,"location":"厦门","text":"内部资料"};空串 / on:false = 关
saveExif Boolean true 写入 EXIF
saveLocation Boolean false 写入 GPS(开启才申请定位)
silentCapture Boolean false 无声拍照(抓帧,无快门音)
mute Boolean false 录像静音
coverFrame Number 10 录像封面取第 N 帧
videoQuality String fhd 录像档位 uhd / fhd / hd / sd;设备不支持指定档位时自动回退
videoFps Number 30 录像帧率
enableZoomGesture Boolean true 两指缩放手势
enableTapFocus Boolean true 点按对焦

事件

事件 触发时机 detail
@ready 相机就绪 zoomMin / zoomMax / exposureMin / exposureMax / hasFlash / position / photoMaxWidth / photoMaxHeight / videoQuality / videoQualities;iOS 老设备兼容字段 videoQualitiesJson
@captured 拍照完成 type / path / width / height / size / time / model / hasGps / lat / lng(iOS 另含 make / orientation / fnumber / iso / exposure)
@recordstart 录像开始
@recordstop 录像结束 type / path / size / cover(可选) / duration(毫秒) / width / height
@zoomchange 变焦变化 zoom
@focus 对焦
@error 出错 code / message

payload 双端形态略有差异(Android 为 JSON 字符串、iOS 为 e.detail),用上面的 parse(e) 统一处理即可。

方法(this.$refs.cam.xxx)

方法 说明
takePhoto() 拍照(结果走 @captured)
startRecord() / stopRecord() 开始 / 停止录像
switchCamera() 切换前后摄
changeCameraPosition('back' | 'front') 设置镜头
zoomTo(ratio) 变焦到指定倍数
exposureTo(ev) 设置曝光档
flashTo('off' | 'on' | 'auto' | 'torch') 设置闪光
focusAt(x, y) 对焦到 0~1 坐标
requestPermission('camera') 申请相机权限
requestPermission('microphone') 申请麦克风权限(仅录像收声需要)
requestPermission('location') 申请定位权限(仅写 GPS 需要)
startCamera() / stopCamera() 启停预览(建议 onShow / onHide)
setWatermarkConfig(...) 动态设置水印
refresh() 刷新预览

系统要求与权限

  • Android minSdk 21(5.0)+,需自定义基座 / 云打包;iOS 12.0+
  • 权限:相机(必需) / 定位(可选,仅写 GPS 时);麦克风仅录像收声时需要
  • Android 插件默认不声明 RECORD_AUDIO,云打包不会自动加入录音权限;如业务需要录像收声,请在宿主 manifest.json 额外添加 android.permission.RECORD_AUDIO,并在使用前调用 requestPermission('microphone')
  • iOS 相机 / 麦克风 / 定位用途串插件已内置声明,云打包自动合并

购买与售后

  • 支持试用,先试后买;源码版含 Android(CameraX) + iOS(AVFoundation) 完整 uts 源码 + 示例工程
  • 定制 / 对接问题:插件评论区留言

隐私、权限声明

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

相机(拍照录像必需)、定位(可选,仅写入照片GPS时);麦克风仅录像收声时由宿主应用按需自行添加

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

插件本身不采集不上传任何数据;照片/视频仅存本机,GPS 仅在 saveLocation=true 时写入图片 EXIF

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