更新记录

1.1.2(2025-11-06)

新增功能(临时更新)

问题修复

  • 快捷键拍照(蓝牙自拍杆、手机音量键)拍照时,返回后按钮无法操作的问题修复
  • 页面在没启用shortcut(快捷键拍照)时,也会进入快捷键的问题修复
  • 修复在低版本HubuildX时打包出现找不到类型的问题

功能优化

  • 优化了相机资源在进入时卡顿的问题

计划新增功能(大版本更新)

  • 完善鸿蒙Harmony版本的并进行更新

1.1.1(2025-11-03)

新增功能(临时更新)

  • 新增设置照片输出格式的方法changeSuffix

问题修复

  • 修复照片格式无法设置的问题【原因是在uni给出的生命周期内,无法取到props的参数,只能在watch中处理】

功能优化

计划新增功能(大版本更新)

  • 完善鸿蒙Harmony版本的并进行更新

1.1.0(2025-10-31)

新增功能

  • 快捷键拍照: 如:按两下音量键拍照、按音量键拍照等等(可自定义)

  • 蓝牙自拍杆: 提供可以连接蓝牙自拍杆拍照、对焦等(可自定义)

  • 相机是否开启蓝牙自拍杆、手机快捷键拍照,可自定义快捷键,具体参考参数shortcut

  • 问题修复

功能优化

计划新增功能(大版本更新)

  • 完善鸿蒙Harmony版本的并进行更新
查看更多

平台兼容性

uni-app(4.31)

Vue2 Vue2插件版本 Vue3 Vue2插件版本 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 5.0 1.0.0 × -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × ×

uni-app x(4.31)

Chrome Safari Android Android插件版本 iOS 鸿蒙 微信小程序
× × 5.0 1.0.0 × - ×

其他

多语言 暗黑模式 宽屏模式
× ×

原生自定义相机拍照、视频录制 (ima-camera-view)

原生自定义相机拍照、视频录制 (ima-camera-view)是基于原生相机开发的UTS插件,支持相机拍照视频录制 、可实现点击聚焦手势缩放自定义布局自定义蒙版(用于人脸拍照,身份证拍照等)。

⚠️注意️

  • android 端已全部完成代码的开发与测试(已完成)
  • harmony 端已完成部分代码的开发与实现,待测试无问题后,再进行发布,敬请关注(已完成,测试中...)
  • ios 端由于苹果Developer年费续费到期、开发|发布证书等一系列导致无法进行调试等,所以暂无开发计划(已写有部分代码,需要的话可单独联系「不保证运行,本插件中不存在该代码」) (暂无计划)
  • 小程序、H5、快应用暂无开发计划(暂无计划)

支持功能

  • 打开、关闭摄像头预览
  • 拍照、快照拍照
  • 录制视频、快照录制视频
  • 设置摄像头缩放级别
  • 设置相机白平衡
  • 设置相机HDR
  • 设置摄像头方向
  • 设置闪光灯模式
  • 设置音频(录制视频时)
  • 设置拍照、录制视频的声音(可自定义)
  • 蓝牙自拍杆(可自定义)
  • 手机快捷键(可自定义)

自定义调整

  • 自定义调整页面地址:uni_modules/ima-camera-view/utssdk/app-android/index.vue
  • 蓝牙自拍杆、手机快捷键的自定义,可以参考文件中的shortcutListener方法
  • 设置拍照、录制视频的声音,可以参考文件中的photoSoundvideoSound方法

需要权限

  • 摄像头、音频、文件读取、文件写入、震动
"android.permission.CAMERA",
"android.permission.RECORD_AUDIO",
"android.permission.READ_EXTERNAL_STORAGE"
"android.permission.WRITE_EXTERNAL_STORAGE"
"android.permission.VIBRATE"
  • 即:在manifest.json中的distribute.android.permissions加入
// 拍摄照片和视频时需要
<uses-permission android:name="android.permission.CAMERA" /> 
// 拍摄视频时需要Audio.ON(默认)
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
// 读取拍照、录像文件文件时需要
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
// 报错拍照、录像文件文件时需要(默认保存到沙盒缓存)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
// 震动权限
<uses-permission android:name="android.permission.VIBRATE" />

快门声音素材

  • 将需要的快门声音放在uni_modules/ima-camera-view/utssdk/app-android/assets下即可
  • 熊猫办公
  • 站长素材

使用示例【此示例的代码只实现了相机拍照的逻辑,更多示例请导入项目】

  • 新建一个camera.nvue的文件
  • ⚠️注意️:只能在.nvue.uvue的文件后缀下才生效,不支持.vue
<template>
    <view class="ima-camera" :style="{ width: windowWidth, height: windowHeight }">
        <ima-camera-view
            ref="cameraRef"
            class="camera-view"
            :style="{ width: windowWidth + 'px', height: windowHeight + 'px' }"
            flash="on"
            @onPictureTaken="onPictureTaken"
            onFocusStart="onFocusStart"
        />
        <view class="camera-menu">
            <!--返回键-->
            <cover-image @tap="back" class="camera-menu-button back" src="/static/camera/back.png" />
            <!--快门键-->
            <cover-image
                @tap="takePhoto"
                class="camera-menu-button shutter"
                src="/static/camera/shutter.png"
            />
            <!--反转键-->
            <cover-image @tap="flip" class="camera-menu-button flip" src="/static/camera/flip.png" />
        </view>
    </view>
</template>

<script>
let _this = null
export default {
    data() {
        return {
            windowWidth: '', //屏幕可用宽度
            windowHeight: '', //屏幕可用高度
            facing: 'back'
        }
    },
    onLoad() {
        _this = this
        this.initCamera()
    },
    methods: {
        //初始化相机
        initCamera() {
            console.log('初始化相机')
            uni.getSystemInfo({
                success: (res) => {
                    _this.windowWidth = res.windowWidth
                    _this.windowHeight = res.windowHeight
                }
            })
        },
        onFocusStart(e) {
            console.log('聚焦', e)
        },
        takePhoto() {
            console.log('拍照', this.facing)
            this.$refs.cameraRef.takePhoto()
        },
        //返回
        back() {
            console.log('返回上一页', this.facing)
            uni.navigateBack()
        },
        //反转
        flip() {
            console.log('镜头反转', this.facing)
            this.facing = this.facing === 'back' ? 'front' : 'back'
            this.$refs.cameraRef.changeFacing(this.facing)
        },
        onPictureTaken(e) {
            console.log('拍照结果', e.detail)
            _this.snapshotsrc = e.detail?.path || ''
            _this.getTakenRes()
            uni.navigateBack()
        },
        //设置
        getTakenRes() {
            console.log('返回结果给上一页')
            let pages = getCurrentPages()
            let prevPage = pages[pages.length - 2] //上一个页面
            //直接调用上一个页面的setImage()方法,把数据存到上一个页面中去
            prevPage.$vm.setImage({ path: _this.snapshotsrc })
        }
    }
}
</script>

<style lang="scss">
.ima-camera {
    justify-content: center;
    align-items: center;

    .camera-view {
        width: 100%;
        background: #111;
    }

    .camera-menu {
        position: absolute;
        left: 0;
        bottom: 0;
        width: 750rpx;
        height: 180rpx;
        z-index: 98;
        align-items: center;
        justify-content: center;

        &-button {
            width: 80rpx;
            height: 80rpx;
            position: absolute;
            bottom: 50rpx;
            z-index: 99;
            align-items: center;
            justify-content: center;
        }

        .back {
            left: 30rpx;
        }

        .shutter {
            width: 130rpx;
            height: 130rpx;
            left: 310rpx;
            bottom: 25rpx;
        }

        .flip {
            right: 30rpx;
        }
    }
}
</style>

常见的比例的定义(widthRatio,heightRatio)

// 正方形
AspectRatio.of(1, 1)      // 1:1

// 竖屏比例
AspectRatio.of(9, 16)     // 9:16 (手机竖屏)
AspectRatio.of(3, 4)      // 3:4
AspectRatio.of(2, 3)      // 2:3
AspectRatio.of(10, 16)    // 10:16 (5:8)

// 横屏比例
AspectRatio.of(16, 9)     // 16:9 (宽屏)
AspectRatio.of(4, 3)      // 4:3 (传统)
AspectRatio.of(3, 2)      // 3:2 (照片)
AspectRatio.of(16, 10)    // 16:10 (8:5)
AspectRatio.of(21, 9)     // 21:9 (超宽屏)

// 建议比例
const AspectRatios = {
  // 1:1 正方形
  SQUARE: AspectRatio.of(1, 1),
  // 9:16 竖屏(手机默认)
  PORTRAIT: AspectRatio.of(9, 16),
  // 16:9 横屏
  LANDSCAPE: AspectRatio.of(16, 9),
  // 3:4 传统照片比例
  THREE_FOUR: AspectRatio.of(3, 4),
  // 4:3 传统相机比例
  FOUR_THREE: AspectRatio.of(4, 3)
}

不同场景的推荐值(tolerance)

const TOLERANCE = {
  STRICT: 0.01.toFloat(),    // 非常严格,几乎精确匹配
  STANDARD: 0.05.toFloat(),  // 标准,推荐使用
  FLEXIBLE: 0.1.toFloat(),   // 灵活,兼容更多设备
  LOOSE: 0.2.toFloat()       // 宽松,可能匹配到意外比例
}

Api

属性 类型 默认值 说明 平台
widthRatio Number 0 照片尺寸比率(宽度): 默认全屏(若widthRatio为9,heightRatio为16,则为9:16、widthRatio为3,heightRatio为4,则为3:4...)不建议值过大,常用的比例有1:1、3:4、4:3、9:16... android
heightRatio Number 0 照片尺寸比率(高度): 默认全屏(若widthRatio为9,heightRatio为16,则为9:16、widthRatio为3,heightRatio为4,则为3:4...)不建议值过大,常用的比例有1:1、3:4、4:3、9:16... android
tolerance Number 0.1 照片尺寸容差值: 建议设为 0.05~0.15,以便稍微兼容不同设备相机实际比例差异 ,值为:0~1 android
whiteBalance iWhiteBalance "auto" 白平衡模式: auto(自动)、incandescent(白炽)、fluorescent(荧光)、daylight(日光)、loudy(多云) android
hdr iHdr "off" HDR模式: off(关闭)、on(开启) android
facing iFacing "back" 后置、前置摄像头: back(后置摄像头)、front(前置摄像头) android
flash iFlash "off" 闪光灯: off(关闭)、on(开启)、auto(自动)、torch(常开) android
audio iAudio "on" 音频: on(开启)、off(关闭)、mono(单声道)、stereo(立体声) android
photoSuffix iPhotoSuffix "jpeg" 照片格式: jpeg、jpg android
mode String 'picture' 相机模式: picture(拍照)、video(录视频) android
shutter Boolean true 是否打开拍照声音: true(开启,此时配置sound才起作用)、false(关闭) android
sound String '' 相机拍照声音文件: 将mp3音频文件放在uni_modules/ima-camera-view/utssdk/app-android/assets下即可,为音频文件的名称,如xxx.mp3,默认手机原声 android
recorder Boolean true 是否打开录像声音: true(开启,此时配置sound2才起作用)、false(关闭) android
sound2 String '' 相机录像声音文件: 将mp3音频文件放在uni_modules/ima-camera-view/utssdk/app-android/assets下即可,为音频文件的名称,如xxx.mp3,默认手机原声 android
vibrate Boolean false 是否打开拍照震动: true(开启,此时配置duration才起作用)、false(关闭) android
duration Number 300 是否打开拍照震动时长,单位:毫秒(ms) android
shortcut Boolean false 是否开启蓝牙自拍杆、手机快捷键拍照: false(关闭)、true(开启) android

方法

共同 方法/ /

方法名称 说明 方法参数 平台
open 打开摄像头预览 android
close 关闭摄像头预览 android
takePhoto 拍照(标准拍照流程) android
takeVideo(duration) 开始录制视频 duration:拍摄时长,单位:毫秒(ms)【0 表示不限制】 android
stopVideo 停止视频录制 android
changeZoom 设置摄像头缩放级别 zoom:缩放倍数(浮点数) android
changeWhiteBalance(whiteBalance) 设置相机白平衡 whiteBalance:参考api中的whiteBalance参数 android
changeHdr(hdr) 设置相机HDR hdr:参考api中的hdr参数 android
changeFacing((facing)) 设置摄像头方向 facing:参考api中的facing参数 android
changeFlash(flash) 设置闪光灯模式 flash:参考api中的flashs参数 android
changeAudio(audio) 设置音频 audio:参考api中的audio参数 android
changeSuffix(suffix) 设置照片输出格式 suffix:参考api中的photoSuffix参数 android
changeAspectRatio(widthRatio,heightRatio,tolerance) 设置相机特定比例 widthRatio:参考api中的widthRatio参数、heightRatio:参考api中的widthRatio参数、tolerance:参考api中的tolerance参数 android
takePhotoSnapshot 快照拍照(适用于快速拍照场景) android
takeVideoSnapshot(duration) 快照方式录制视频 duration:拍摄时长,单位:毫秒(ms)【0 表示不限制】 android

事件

事件名称 说明 回调参数 平台
onPictureTaken 拍照返回数据 ({path,width,height}: any) => {} android
onVideoTakenStart 录制视频开始事件 () => {} android
onVideoTakenEnd 录制视频结束事件 ({path,size}: any) => {} android
onFocusStart 自动对焦开始 ({x,y}: any) => {} android
onFocusEnd 自动对焦结束 ({x,y,focus}: any) => {} android

隐私、权限声明

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

摄像头、音频、文件读取、文件写入 <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" />

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

插件不采集任何数据

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