Skip to content

使用方法

安卓水印相机UTS原生插件集成了相机常用功能初始化加载自定义水印,拍照,录像,曝光调节,焦距调节,闪光点开关灯,支持静默拍照和录像,插件支持uniapp和uniapp x,支持vue2和vue3的选项式和组合式

提醒

如果插件需要扩展其他功能请联系作者

插件使用注意事项

  • 如果您在使用插件的过程中有任何问题,可以联系作者,作者将全力协助您使用插件
  • 本文档同时提供了uniapp的用法示例和uniappx的用法示例,插件市场导入的示例项目仅为uniapp的用法示例,如果您需要uniappx的示例项目可以通过下方的链接下载示例

    https://pan.baidu.com/s/1vP3W5fhfHE39NSllICtjPA?pwd=er6f

  • 组件只能在nvue/uvue页面中使用,不支持vue页面

相关链接

联系作者

关注微信公众号可联系作者

插件地址

https://ext.dcloud.net.cn/plugin?id=29607

权限

  • android.permission.CAMERA
  • android.hardware.camera
  • android.hardware.camera.autofocus
  • android.permission.WRITE_EXTERNAL_STORAGE
  • android.permission.READ_EXTERNAL_STORAGE

API用法

在使用插件的地方引入以下代码:

js
import * as module from "@/uni_modules/leven-waterCamera"
js
import * as module from "@/uni_modules/leven-waterCamera"

组件用法

在使用插件的地方引入以下代码:

vue
<leven-waterCamera ref="refCamera" style="flex:1; height: 500px;" :config="config" @onError="onError"
  @onEvent="onEvent" @onEventMethod="onEventMethod">
</leven-waterCamera>
vue
<leven-waterCamera ref="refLevenCamera" style="flex:1; height: 500px;" :configX="config" @onError="onError"
  @onEventMethod="onEventMethod">
</leven-waterCamera>

//组件的引用
const refCamera = ref<LevenUtsWaterCameraElement | null>(null)

页面内容

API页面

vue
<template>
  <view class="content">
    <uni-card title="其他功能">
      <button type="primary" @click="requestPermissions">申请插件所需权限</button>
      <button type="primary" @click="checkAllFilesPermission">检查是否有所有文件访问权限</button>
      <button type="primary" @click="toAllFilesPermissionPage">跳转到所有文件访问权限页面</button>
      <button type="primary" @click="toPage('noPreview')">静默拍照录像模式</button>
      <button type="primary" @click="toPage('preview')">预览模式</button>
    </uni-card>
  </view>
</template>

<script>
  import * as module from "@/uni_modules/leven-waterCamera"
  export default {
    data() {
      return {}
    },
    onLoad() {

    },
    methods: {
      //跳转页面
      toPage(type) {
        switch (type) {
          case 'noPreview':
            uni.navigateTo({
              url: "/pages/index/noPreview"
            })
            break;
          case 'preview':
            uni.navigateTo({
              url: "/pages/index/preview"
            })
            break;
        }
      },
      requestPermissions() {
        module.requestPermissions({
          params: {
            permissions: [
              'android.permission.WRITE_EXTERNAL_STORAGE',
              'android.permission.READ_EXTERNAL_STORAGE',
              'android.permission.RECORD_AUDIO',
              'android.permission.CAMERA'
            ]
          },
          complete: (res) => {
            console.log(res)
          }
        })
      },
      //检查所有文件访问权限
      checkAllFilesPermission() {
        module.checkAllFilesPermission({
          complete: (res) => {
            console.log(res)
          }
        })
      },
      //跳转到所有文件访问权限页面
      toAllFilesPermissionPage() {
        module.toAllFilesPermissionPage({
          complete: (res) => {
            console.log(res)
          }
        })
      }
    }
  }
</script>

<style>

</style>
vue
<template>
  <!-- #ifdef APP -->
  <scroll-view style="flex:1">
  <!-- #endif -->
    <rice-cell-group border>
      <rice-cell title="静默拍照录像模式" arrow clickable @click="toPage('noPreview')"></rice-cell>
      <rice-cell title="预览模式" arrow clickable @click="toPage('preview')"></rice-cell>
    </rice-cell-group>
  <!-- #ifdef APP -->
  </scroll-view>
  <!-- #endif -->
</template>

<script setup lang="uts">
  import * as module from "@/uni_modules/leven-waterCamera"
  import { LevenResult, LevenOptions } from "@/uni_modules/leven-waterCamera"

  function toPage(type : string) {
    switch (type) {
      case "noPreview":
        uni.navigateTo({
          url: "/pages/waterCamera/noPreview"
        })
        break
      case "preview":
        uni.navigateTo({
          url: "/pages/waterCamera/preview"
        })
        break
    }
  }

  //显示消息
  function showMessage(message : string) {
    uni.showToast({
      title: message,
      icon: "none"
    })
  }

  //跳转到所有文件访问权限页面
  function toAllFilesPermissionPage() {
    module.toAllFilesPermissionPage({
      complete: (res : LevenResult) => {
        if (res.code == 0) {
          let data = res.data;
          let status : boolean = data.getBoolean("status")!
          if (!status) {
            showMessage("所有文件访问权限未打开")
          } else {
            showMessage("权限授权完成,欢迎使用")
          }
        } else {
          showMessage("跳转到所有文件访问权限页面失败")
        }
      }
    } as LevenOptions)
  }

  //检测是否有所有文件访问权限
  function checkAllFilesPermission() {
    module.checkAllFilesPermission({
      complete: (res : LevenResult) => {
        if (res.code == 0) {
          let data = res.data;
          let status : boolean = data.getBoolean("status")!
          if (!status) {
            toAllFilesPermissionPage();
          } else {
            showMessage("权限授权完成,欢迎使用")
          }
        } else {
          showMessage("查询文件权限失败")
        }
      }
    } as LevenOptions)
  }

  //申请权限
  function requestPermissions() {
    module.requestPermissions({
      params: {
        permissions: [
          'android.permission.READ_EXTERNAL_STORAGE',
          'android.permission.WRITE_EXTERNAL_STORAGE',
          'android.permission.RECORD_AUDIO',
          'android.permission.CAMERA'
        ]
      },
      complete: (res : LevenResult) => {
        console.log(res)
        if (res.code == 0) {
          checkAllFilesPermission()
        } else {
          showMessage("权限申请未通过")
        }
      }
    } as LevenOptions)
  }

  //页面加载
  onMounted(() => {
    //申请权限
    requestPermissions();
  })
</script>

<style>

</style>

组件页面

预览模式

vue
<template>
  <view>
    <view style="flex: 1; height: 300px;">
      <leven-waterCamera ref="refCamera" style="flex:1; height: 300px;" :config="config" @onError="onError"
        @onEvent="onEvent" @onEventMethod="onEventMethod">
      </leven-waterCamera>
    </view>
    <button type="primary" @click="addWater">添加水印</button>
    <button type="primary" @click="setFlashMode">设置闪光灯模式</button>
    <button type="primary" @click="setZoom">设置焦距</button>
    <button type="primary" @click="getZoomRange">获取相机支持的焦距</button>
    <button type="primary" @click="setExposure">设置曝光</button>
    <button type="primary" @click="getExposureRange">获取相机支持的曝光度</button>
    <button type="primary" @click="isExposureSupported">获取相机是否支持曝光度</button>
    <button type="primary" @click="stopPreview">关闭预览</button>
    <button type="primary" @click="startPreview">开启预览</button>
    <button type="primary" @click="switchCamera">切换摄像头</button>
    <button type="primary" @click="takePicture">拍照</button>
    <button type="primary" @click="startRecording">开始录像</button>
    <button type="primary" @click="stopRecording">结束录像</button>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        config: {
          //视图的圆角值
          radius: 10,
          //图片保存目录
          // pictureDir: "",
          //视频保存目录
          // videoDir: "",
          //摄像头旋转角度
          // rotation: 0,
          //默认打开的摄像头,0:前置,1:后置
          // facing: 0,
          //闪光灯模式,0.自动,1.一直打开,2.关闭,前置摄像头无效
          flashModel: 0,
          //分辨率
          // size: [1920, 1080],
          //拍照质量,可选值:quality、latency
          // captureMode: "quality",
          //录像质量,可选值:SD、HD、FHD、UHD、LOWEST、HIGHEST
          videoQuality: "FHD",
          //默认水印配置
          water: [{
            //水印文本内容
            text: "这是一条纯文本水印",
            //水印颜色
            color: "#FFFFFF",
            //文本大小
            textSize: 30,
            //文本样式
            typeFace: "BOLD_ITALIC",
            //透明度
            alpha: 90,
            //水印上边距
            topMargin: 40,
            //水印下边距
            bottomMargin: 40,
            //水印左边距
            leftMargin: 40,
            //水印右边距
            rightMargin: 40,
            //水印位置
            position: 0
          }, {
            //水印图标,如果是静态资源需放置到drawable目录下,支持本地图片绝对路径
            icon: "icon",
            //水印位置
            position: 1
          }]
        },
        //曝光度
        exposure: 0,
        //焦距
        zoom: 1.0,
      }
    },
    methods: {
      //添加水印
      addWater() {
        let params = this.config.water;
        params.push({
          //水印文本内容
          text: "图片加水印",
          //水印图标,如果是静态资源需放置到drawable目录下,支持本地图片绝对路径
          icon: "icon",
          //水印位置
          position: 2
        })
        this.$refs.refCamera.addWater({
          water: params
        });
      },
      //设置闪光点模式
      setFlashMode() {
        this.config.flashModel++;
        if (this.config.flashModel > 2) {
          this.config.flashModel = 0;
        }
        this.$refs.refCamera.setFlashMode({
          flashMode: this.config.flashModel
        });
      },
      //设置焦距
      setZoom() {
        this.zoom++;
        if (this.zoom > 8) {
          this.zoom = 1;
        }
        this.$refs.refCamera.setZoom({
          zoom: this.zoom
        });
      },
      //获取相机支持的焦距
      getZoomRange() {
        this.$refs.refCamera.getZoomRange();
      },
      //设置曝光
      setExposure() {
        this.exposure++;
        if (this.exposure > 24) {
          this.exposure = -24;
        }
        this.$refs.refCamera.setExposure({
          value: this.exposure
        });
      },
      //获取相机支持的曝光度
      getExposureRange() {
        this.$refs.refCamera.getExposureRange();
      },
      //获取相机是否支持曝光度
      isExposureSupported() {
        this.$refs.refCamera.isExposureSupported();
      },
      //结束录像
      stopRecording() {
        this.$refs.refCamera.stopRecording();
      },
      //开始录像
      startRecording() {
        this.$refs.refCamera.startRecording();
      },
      //拍照
      takePicture() {
        this.$refs.refCamera.takePicture();
      },
      //切换摄像头
      switchCamera() {
        this.$refs.refCamera.switchCamera();
      },
      //开启预览
      startPreview() {
        this.$refs.refCamera.startPreview();
      },
      //关闭预览
      stopPreview() {
        this.$refs.refCamera.stopPreview();
      },
      //**********************事件***********************
      //错误事件
      onError(e) {
        console.log(e.detail)
      },
      //其他事件
      onEvent(e) {
        console.log(e.detail)
      },
      //方法事件
      onEventMethod(e) {
        console.log(e.detail)
        let detail = e.detail;
        let type = detail.type;
        let resultData = detail.data;
        switch (type) {
          case "stopPreview":
            //关闭预览
            console.log("关闭预览:" + JSON.stringify(resultData))
            break
          case "startPreview":
            //开启预览
            console.log("开启预览:" + JSON.stringify(resultData))
            break
          case "switchCamera":
            //切换摄像头
            console.log("切换摄像头:" + JSON.stringify(resultData))
            break
          case "takePicture":
            //拍照
            console.log("拍照:" + JSON.stringify(resultData))
            break
          case "startRecording":
            //开始录像
            console.log("开始录像:" + JSON.stringify(resultData))
            break
          case "stopRecording":
            //结束录像
            console.log("结束录像:" + JSON.stringify(resultData))
            break
          case "isExposureSupported":
            //获取相机是否支持曝光度
            console.log("获取相机是否支持曝光度:" + JSON.stringify(resultData))
            break
          case "getExposureRange":
            //获取相机是否支持曝光度
            console.log("获取相机支持的曝光度:" + JSON.stringify(resultData))
            break
          case "setExposure":
            //设置曝光
            console.log("设置曝光:" + JSON.stringify(resultData))
            break
          case "getZoomRange":
            //获取相机支持的焦距
            console.log("获取相机支持的焦距:" + JSON.stringify(resultData))
            break
          case "setZoom":
            //设置焦距
            console.log("设置焦距:" + JSON.stringify(resultData))
            break
          case "setFlashMode":
            //设置闪光灯模式
            console.log("设置闪光灯模式:" + JSON.stringify(resultData))
            break
        }
      }
    }
  }
</script>

<style>

</style>
vue
<template>
  <!-- #ifdef APP -->
  <scroll-view style="flex:1">
  <!-- #endif -->
    <view style="width: 750rpx; height: 300px; position: relative;">
      <leven-waterCamera ref="refCamera" style="flex:1; height: 300px; margin-bottom: 20px;" :configX="config"
        @onError="onError" @onEvent="onEvent" @onEventMethod="onEventMethod">
      </leven-waterCamera>
    </view>
    <leven-ui-card title="组件方法">
      <button type="primary" @click="addWater">添加水印</button>
      <button type="primary" @click="setFlashMode">设置闪光灯模式</button>
      <button type="primary" @click="setZoom">设置焦距</button>
      <button type="primary" @click="getZoomRange">获取相机支持的焦距</button>
      <button type="primary" @click="setExposure">设置曝光</button>
      <button type="primary" @click="getExposureRange">获取相机支持的曝光度</button>
      <button type="primary" @click="isExposureSupported">获取相机是否支持曝光度</button>
      <button type="primary" @click="stopPreview">关闭预览</button>
      <button type="primary" @click="startPreview">开启预览</button>
      <button type="primary" @click="switchCamera">切换摄像头</button>
      <button type="primary" @click="takePicture">拍照</button>
      <button type="primary" @click="startRecording">开始录像</button>
      <button type="primary" @click="stopRecording">结束录像</button>
    </leven-ui-card>
  <!-- #ifdef APP -->
  </scroll-view>
  <!-- #endif -->
</template>

<script setup lang="uts">
  import JSONObject from 'com.alibaba.fastjson.JSONObject'
  const config = ref({
    //视图的圆角值
    radius: 10,
    //图片保存目录
    // pictureDir: "",
    //视频保存目录
    // videoDir: "",
    //摄像头旋转角度
    // rotation: 0,
    //默认打开的摄像头,0:前置,1:后置
    // facing: 0,
    //闪光灯模式,0.自动,1.一直打开,2.关闭,前置摄像头无效
    flashModel: 0,
    //分辨率
    // size: [1920, 1080],
    //拍照质量,可选值:quality、latency
    // captureMode: "quality",
    //录像质量,可选值:SD、HD、FHD、UHD、LOWEST、HIGHEST
    videoQuality: "FHD",
    //默认水印配置
    water: [{
      //水印文本内容
      text: "这是一条纯文本水印",
      //水印颜色
      color: "#FFFFFF",
      //文本大小
      textSize: 30,
      //文本样式
      typeFace: "BOLD_ITALIC",
      //透明度
      alpha: 90,
      //水印上边距
      topMargin: 40,
      //水印下边距
      bottomMargin: 40,
      //水印左边距
      leftMargin: 40,
      //水印右边距
      rightMargin: 40,
      //水印位置
      position: 0
    }, {
      //水印图标,如果是静态资源需放置到drawable目录下,支持本地图片绝对路径
      icon: "icon",
      //水印位置
      position: 1
    }]
  })
  //闪光灯模式
  const flashModel = ref(0)
  const zoom = ref(1.0)
  const exposure = ref(0)
  const refCamera = ref<LevenUtsWaterCameraElement | null>(null)

  //结束录像
  function stopRecording() {
    refCamera.value?.stopRecording();
  }

  //开始录像
  function startRecording() {
    refCamera.value?.startRecording();
  }

  //拍照
  function takePicture() {
    refCamera.value?.takePicture();
  }

  //切换摄像头
  function switchCamera() {
    refCamera.value?.switchCamera();
  }

  //开启预览
  function startPreview() {
    refCamera.value?.startPreview();
  }

  //关闭预览
  function stopPreview() {
    refCamera.value?.stopPreview();
  }

  //获取相机是否支持曝光度
  function isExposureSupported() {
    refCamera.value?.isExposureSupported();
  }

  //设置曝光
  function setExposure() {
    exposure.value++;
    if (exposure.value > 24) {
      exposure.value = -24;
    }
    let options = {
      value: exposure.value
    }
    let params : JSONObject = JSONObject.parse(JSON.stringify(options)) as JSONObject
    refCamera.value?.setExposure(params);
  }

  //获取相机支持的曝光度
  function getExposureRange() {
    refCamera.value?.getExposureRange();
  }

  //设置焦距
  function setZoom() {
    zoom.value++;
    if (zoom.value > 8) {
      zoom.value = 1;
    }
    let options = {
      zoom: zoom.value
    };
    let params : JSONObject = JSONObject.parse(JSON.stringify(options)) as JSONObject
    refCamera.value?.setZoom(params);
  }
  //获取相机支持的焦距
  function getZoomRange() {
    refCamera.value?.getZoomRange();
  }

  //设置闪光点模式
  function setFlashMode() {
    flashModel.value++;
    if (flashModel.value > 2) {
      flashModel.value = 0;
    }
    let options = {
      flashMode: flashModel.value
    };
    let params : JSONObject = JSONObject.parse(JSON.stringify(options)) as JSONObject
    refCamera.value?.setFlashMode(params);
  }

  function addWater() {
    let options = {
      water: [{
        //水印文本内容
        text: "这是一条纯文本水印",
        //水印颜色
        color: "#FFFFFF",
        //文本大小
        textSize: 30,
        //文本样式
        typeFace: "BOLD_ITALIC",
        //透明度
        alpha: 90,
        //水印上边距
        topMargin: 40,
        //水印下边距
        bottomMargin: 40,
        //水印左边距
        leftMargin: 40,
        //水印右边距
        rightMargin: 40,
        //水印位置
        position: 0
      }, {
        //水印图标,如果是静态资源需放置到drawable目录下,支持本地图片绝对路径
        icon: "icon",
        //水印位置
        position: 1
      }, {
        //水印文本内容
        text: "图片加文本",
        //水印图标,如果是静态资源需放置到drawable目录下,支持本地图片绝对路径
        icon: "icon",
        //水印位置
        position: 2
      }]
    };
    let params : JSONObject = JSONObject.parse(JSON.stringify(options)) as JSONObject
    refCamera.value?.addWater(params);
  }

  //错误事件
  function onError(e : JSONObject) {
    console.log("onError:" + JSON.stringify(e))
  }

  //其他事件
  function onEvent(e : JSONObject) {
    console.log("onEvent:" + JSON.stringify(e))
  }

  //方法事件
  function onEventMethod(e : JSONObject) {
    console.log("onEventMethod:" + JSON.stringify(e))
  }
</script>

<style>

</style>

静默模式

vue
<template>
  <view>
    <view>
      <leven-waterCamera ref="refCamera" :config="config" @onError="onError" @onEvent="onEvent"
        @onEventMethod="onEventMethod">
      </leven-waterCamera>
    </view>
    <button type="primary" @click="addWater">添加水印</button>
    <button type="primary" @click="setFlashMode">设置闪光灯模式</button>
    <button type="primary" @click="setZoom">设置焦距</button>
    <button type="primary" @click="getZoomRange">获取相机支持的焦距</button>
    <button type="primary" @click="setExposure">设置曝光</button>
    <button type="primary" @click="getExposureRange">获取相机支持的曝光度</button>
    <button type="primary" @click="isExposureSupported">获取相机是否支持曝光度</button>
    <button type="primary" @click="stopPreview">关闭预览</button>
    <button type="primary" @click="startPreview">开启预览</button>
    <button type="primary" @click="switchCamera">切换摄像头</button>
    <button type="primary" @click="takePicture">拍照</button>
    <button type="primary" @click="startRecording">开始录像</button>
    <button type="primary" @click="stopRecording">结束录像</button>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        config: {
          //视图的圆角值
          radius: 10,
          //图片保存目录
          // pictureDir: "",
          //视频保存目录
          // videoDir: "",
          //摄像头旋转角度
          // rotation: 0,
          //默认打开的摄像头,0:前置,1:后置
          // facing: 0,
          //闪光灯模式,0.自动,1.一直打开,2.关闭,前置摄像头无效
          flashModel: 0,
          //分辨率
          // size: [1920, 1080],
          //拍照质量,可选值:quality、latency
          // captureMode: "quality",
          //录像质量,可选值:SD、HD、FHD、UHD、LOWEST、HIGHEST
          videoQuality: "FHD",
          //是否是静默模式
          isSilence: true,
          //默认水印配置
          water: [{
            //水印文本内容
            text: "这是一条纯文本水印",
            //水印颜色
            color: "#FFFFFF",
            //文本大小
            textSize: 30,
            //文本样式
            typeFace: "BOLD_ITALIC",
            //透明度
            alpha: 90,
            //水印上边距
            topMargin: 40,
            //水印下边距
            bottomMargin: 40,
            //水印左边距
            leftMargin: 40,
            //水印右边距
            rightMargin: 40,
            //水印位置
            position: 0
          }, {
            //水印图标,如果是静态资源需放置到drawable目录下,支持本地图片绝对路径
            icon: "icon",
            //水印位置
            position: 1
          }]
        },
        //曝光度
        exposure: 0,
        //焦距
        zoom: 1.0,
      }
    },
    methods: {
      //添加水印
      addWater() {
        let params = this.config.water;
        params.push({
          //水印文本内容
          text: "图片加水印",
          //水印图标,如果是静态资源需放置到drawable目录下,支持本地图片绝对路径
          icon: "icon",
          //水印位置
          position: 2
        })
        this.$refs.refCamera.addWater({
          water: params
        });
      },
      //设置闪光点模式
      setFlashMode() {
        this.config.flashModel++;
        if (this.config.flashModel > 2) {
          this.config.flashModel = 0;
        }
        this.$refs.refCamera.setFlashMode({
          flashMode: this.config.flashModel
        });
      },
      //设置焦距
      setZoom() {
        this.zoom++;
        if (this.zoom > 8) {
          this.zoom = 1;
        }
        this.$refs.refCamera.setZoom({
          zoom: this.zoom
        });
      },
      //获取相机支持的焦距
      getZoomRange() {
        this.$refs.refCamera.getZoomRange();
      },
      //设置曝光
      setExposure() {
        this.exposure++;
        if (this.exposure > 24) {
          this.exposure = -24;
        }
        this.$refs.refCamera.setExposure({
          value: this.exposure
        });
      },
      //获取相机支持的曝光度
      getExposureRange() {
        this.$refs.refCamera.getExposureRange();
      },
      //获取相机是否支持曝光度
      isExposureSupported() {
        this.$refs.refCamera.isExposureSupported();
      },
      //结束录像
      stopRecording() {
        this.$refs.refCamera.stopRecording();
      },
      //开始录像
      startRecording() {
        this.$refs.refCamera.startRecording();
      },
      //拍照
      takePicture() {
        this.$refs.refCamera.takePicture();
      },
      //切换摄像头
      switchCamera() {
        this.$refs.refCamera.switchCamera();
      },
      //开启预览
      startPreview() {
        this.$refs.refCamera.startPreview();
      },
      //关闭预览
      stopPreview() {
        this.$refs.refCamera.stopPreview();
      },
      //**********************事件***********************
      //错误事件
      onError(e) {
        console.log(e.detail)
      },
      //其他事件
      onEvent(e) {
        console.log(e.detail)
      },
      //方法事件
      onEventMethod(e) {
        console.log(e.detail)
        let detail = e.detail;
        let type = detail.type;
        let resultData = detail.data;
        switch (type) {
          case "stopPreview":
            //关闭预览
            console.log("关闭预览:" + JSON.stringify(resultData))
            break
          case "startPreview":
            //开启预览
            console.log("开启预览:" + JSON.stringify(resultData))
            break
          case "switchCamera":
            //切换摄像头
            console.log("切换摄像头:" + JSON.stringify(resultData))
            break
          case "takePicture":
            //拍照
            console.log("拍照:" + JSON.stringify(resultData))
            break
          case "startRecording":
            //开始录像
            console.log("开始录像:" + JSON.stringify(resultData))
            break
          case "stopRecording":
            //结束录像
            console.log("结束录像:" + JSON.stringify(resultData))
            break
          case "isExposureSupported":
            //获取相机是否支持曝光度
            console.log("获取相机是否支持曝光度:" + JSON.stringify(resultData))
            break
          case "getExposureRange":
            //获取相机是否支持曝光度
            console.log("获取相机支持的曝光度:" + JSON.stringify(resultData))
            break
          case "setExposure":
            //设置曝光
            console.log("设置曝光:" + JSON.stringify(resultData))
            break
          case "getZoomRange":
            //获取相机支持的焦距
            console.log("获取相机支持的焦距:" + JSON.stringify(resultData))
            break
          case "setZoom":
            //设置焦距
            console.log("设置焦距:" + JSON.stringify(resultData))
            break
          case "setFlashMode":
            //设置闪光灯模式
            console.log("设置闪光灯模式:" + JSON.stringify(resultData))
            break
        }
      }
    }
  }
</script>

<style>

</style>
vue
<template>
  <!-- #ifdef APP -->
  <scroll-view style="flex:1">
  <!-- #endif -->
    <view>
      <leven-waterCamera ref="refCamera" :configX="config" @onError="onError" @onEvent="onEvent"
        @onEventMethod="onEventMethod">
      </leven-waterCamera>
    </view>
    <leven-ui-card title="组件方法">
      <button type="primary" @click="addWater">添加水印</button>
      <button type="primary" @click="setFlashMode">设置闪光灯模式</button>
      <button type="primary" @click="setZoom">设置焦距</button>
      <button type="primary" @click="getZoomRange">获取相机支持的焦距</button>
      <button type="primary" @click="setExposure">设置曝光</button>
      <button type="primary" @click="getExposureRange">获取相机支持的曝光度</button>
      <button type="primary" @click="isExposureSupported">获取相机是否支持曝光度</button>
      <button type="primary" @click="stopPreview">关闭预览</button>
      <button type="primary" @click="startPreview">开启预览</button>
      <button type="primary" @click="switchCamera">切换摄像头</button>
      <button type="primary" @click="takePicture">拍照</button>
      <button type="primary" @click="startRecording">开始录像</button>
      <button type="primary" @click="stopRecording">结束录像</button>
    </leven-ui-card>
  <!-- #ifdef APP -->
  </scroll-view>
  <!-- #endif -->
</template>

<script setup lang="uts">
  import JSONObject from 'com.alibaba.fastjson.JSONObject'
  const config = ref({
    //视图的圆角值
    radius: 10,
    //图片保存目录
    // pictureDir: "",
    //视频保存目录
    // videoDir: "",
    //摄像头旋转角度
    // rotation: 0,
    //默认打开的摄像头,0:前置,1:后置
    // facing: 0,
    //闪光灯模式,0.自动,1.一直打开,2.关闭,前置摄像头无效
    flashModel: 0,
    //分辨率
    // size: [1920, 1080],
    //拍照质量,可选值:quality、latency
    // captureMode: "quality",
    //录像质量,可选值:SD、HD、FHD、UHD、LOWEST、HIGHEST
    videoQuality: "FHD",
    //是否是静默模式
    isSilence: true,
    //默认水印配置
    water: [{
      //水印文本内容
      text: "这是一条纯文本水印",
      //水印颜色
      color: "#FFFFFF",
      //文本大小
      textSize: 30,
      //文本样式
      typeFace: "BOLD_ITALIC",
      //透明度
      alpha: 90,
      //水印上边距
      topMargin: 40,
      //水印下边距
      bottomMargin: 40,
      //水印左边距
      leftMargin: 40,
      //水印右边距
      rightMargin: 40,
      //水印位置
      position: 0
    }, {
      //水印图标,如果是静态资源需放置到drawable目录下,支持本地图片绝对路径
      icon: "icon",
      //水印位置
      position: 1
    }]
  })
  //闪光灯模式
  const flashModel = ref(0)
  const zoom = ref(1.0)
  const exposure = ref(0)
  const refCamera = ref<LevenUtsWaterCameraElement | null>(null)

  //结束录像
  function stopRecording() {
    refCamera.value?.stopRecording();
  }

  //开始录像
  function startRecording() {
    refCamera.value?.startRecording();
  }

  //拍照
  function takePicture() {
    refCamera.value?.takePicture();
  }

  //切换摄像头
  function switchCamera() {
    refCamera.value?.switchCamera();
  }

  //开启预览
  function startPreview() {
    refCamera.value?.startPreview();
  }

  //关闭预览
  function stopPreview() {
    refCamera.value?.stopPreview();
  }

  //获取相机是否支持曝光度
  function isExposureSupported() {
    refCamera.value?.isExposureSupported();
  }

  //设置曝光
  function setExposure() {
    exposure.value++;
    if (exposure.value > 24) {
      exposure.value = -24;
    }
    let options = {
      value: exposure.value
    }
    let params : JSONObject = JSONObject.parse(JSON.stringify(options)) as JSONObject
    refCamera.value?.setExposure(params);
  }

  //获取相机支持的曝光度
  function getExposureRange() {
    refCamera.value?.getExposureRange();
  }

  //设置焦距
  function setZoom() {
    zoom.value++;
    if (zoom.value > 8) {
      zoom.value = 1;
    }
    let options = {
      zoom: zoom.value
    };
    let params : JSONObject = JSONObject.parse(JSON.stringify(options)) as JSONObject
    refCamera.value?.setZoom(params);
  }
  //获取相机支持的焦距
  function getZoomRange() {
    refCamera.value?.getZoomRange();
  }

  //设置闪光点模式
  function setFlashMode() {
    flashModel.value++;
    if (flashModel.value > 2) {
      flashModel.value = 0;
    }
    let options = {
      flashMode: flashModel.value
    };
    let params : JSONObject = JSONObject.parse(JSON.stringify(options)) as JSONObject
    refCamera.value?.setFlashMode(params);
  }

  function addWater() {
    let options = {
      water: [{
        //水印文本内容
        text: "这是一条纯文本水印",
        //水印颜色
        color: "#FFFFFF",
        //文本大小
        textSize: 30,
        //文本样式
        typeFace: "BOLD_ITALIC",
        //透明度
        alpha: 90,
        //水印上边距
        topMargin: 40,
        //水印下边距
        bottomMargin: 40,
        //水印左边距
        leftMargin: 40,
        //水印右边距
        rightMargin: 40,
        //水印位置
        position: 0
      }, {
        //水印图标,如果是静态资源需放置到drawable目录下,支持本地图片绝对路径
        icon: "icon",
        //水印位置
        position: 1
      }, {
        //水印文本内容
        text: "图片加文本",
        //水印图标,如果是静态资源需放置到drawable目录下,支持本地图片绝对路径
        icon: "icon",
        //水印位置
        position: 2
      }]
    };
    let params : JSONObject = JSONObject.parse(JSON.stringify(options)) as JSONObject
    refCamera.value?.addWater(params);
  }

  //错误事件
  function onError(e : JSONObject) {
    console.log("onError:" + JSON.stringify(e))
  }

  //其他事件
  function onEvent(e : JSONObject) {
    console.log("onEvent:" + JSON.stringify(e))
  }

  //方法事件
  function onEventMethod(e : JSONObject) {
    console.log("onEventMethod:" + JSON.stringify(e))
  }
</script>

<style>

</style>