目录

camera

概述

相机组件,同一页面只能插入一个 <camera> 组件。

使用限制

限制条件

说明

适用终端

手机、平板

适用区域

全球

子组件

不支持。

属性

除了支持 通用属性 以外,还支持如下属性。

名称

类型

默认值

是否必填

描述

deviceposition

string

back

否

前置或后置,取值为front、back。

flash

string

auto

否

闪光灯,取值为auto、on、off、torch(手电筒常亮模式)。

framesize(1080+)

string

normal

否

相机帧数尺寸,取值为low、normal、high。

autoexposurelock(1080+)

boolean

false

否

曝光锁定。

autowhitebalancelock(1080+)

boolean

false

否

白平衡锁定。

样式

支持 通用样式 。

事件

除了支持 通用事件 以外,还支持如下事件。

事件

描述

示例

error

用户不允许使用摄像头时触发。

<camera   onerror="cameraError">

cameraframe(1080+)

返回object.data类型的ArrayBuffer图像像素数据,一维数组。每四项表示一个像素点的 RGBA。

  • object.width:

    number类型,表示图像数据矩形的宽度。

  • object.height:

    number类型,表示图像数据矩形的高度。

<camera oncameraframe="cameraFrame"/>

camerainitdone(1080+)

相机初始化完成时触发。

<camera oncamerainitdone="cameraInitDone"/>

方法

[h2]takePhoto(OBJECT)

使用该方法,可以进行拍照。

OBJECT参数说明:

参数

类型

是否必填

说明

quality

string

否

图像质量,取值为high、normal、low,默认值为normal。

cropimage(1076+)

boolean

否

默认值为false。

当设置为true时,会对拍照生成的图片按Camera组件的大小进行裁剪。

success

function

否

成功回调。

fail

function

否

失败回调。

complete

function

否

执行结束后的回调。

success返回值:

参数

类型

说明

uri

string

照片路径。

fail返回错误码:

错误码

说明

201

用户拒绝,获取相机权限失败。

[h2]setPreviewFpsRange(OBJECT)(1080+)

使用该方法,可以设置最大和最小预览帧率,取值范围必须在支持的预览帧率范围内。

OBJECT参数说明:

参数

类型

是否必填

说明

previewfpsrange

object

是

帧率范围,对象应包含最小值和最大值。示例:

{'min':10,'max':30}

success

function

否

成功回调。

fail

function

否

失败回调。

complete

function

否

执行结束后的回调。

fail返回错误码:

错误码

说明

201

用户拒绝授权相机权限。

202

不支持设置的最大值和最小值。

300

设备不支持设置的帧率范围。

[h2]getSupportedPreviewFpsRange(OBJECT)(1080+)

使用该方法,可以获取支持的预览帧率范围。

OBJECT参数说明:

参数

类型

是否必填

说明

success

function

否

成功回调。

fail

function

否

失败回调。

complete

function

否

执行结束后的回调。

success返回值:

参数

类型

说明

supportfpsrange

array

如果获取支持的预览帧率范围成功,则返回类似数组[{"min":15000,"max":15000},{"min":7000,"max":30000}] 。

fail返回错误码:

错误码

说明

300

设备无法获取支持的预览帧率范围。

[h2]getPreviewFpsRange(OBJECT)(1080+)

使用该方法,可以获取设置的预览帧率范围。

OBJECT参数说明:

参数

类型

是否必填

说明

success

function

否

成功回调。

fail

function

否

失败回调。

complete

function

否

执行结束后的回调。

success返回值:

参数

类型

说明

max

int

预览的最大帧率。

min

int

预览的最小帧率。

fail返回错误码:

错误码

说明

300

设备无法获取设置的预览帧率范围。

[h2]setExposureCompensation(OBJECT)(1080+)

使用该方法,可以设置曝光补偿值。

OBJECT参数说明:

参数

类型

是否必填

说明

exposurecompensation

int

是

曝光补偿值。

success

function

否

成功回调。

fail

function

否

失败回调。

complete

function

否

执行结束后的回调。

fail返回错误码:

错误码

说明

201

用户拒绝授权相机权限。

202

不支持设置的最大值和最小值。

300

设备无法设置曝光补偿值。

[h2]getExposureCompensationRange(OBJECT)(1080+)

使用该方法,可以获取支持的曝光补偿值范围。

OBJECT参数说明:

参数

类型

是否必填

说明

success

function

否

成功回调。

fail

function

否

失败回调。

complete

function

否

执行结束后的回调。

success返回值:

参数

类型

说明

max

int

支持的最大曝光补偿值。

min

int

支持的最小曝光补偿值。

fail返回错误码:

错误码

说明

300

设备无法获取支持的曝光补偿值范围。

[h2]getExposureCompensation(OBJECT)(1080+)

使用该方法,可以获取设置的曝光补偿值。

OBJECT参数说明:

参数

类型

是否必填

说明

success

function

否

成功回调。

fail

function

否

失败回调。

complete

function

否

执行结束后的回调。

success返回值:

参数

类型

说明

exposurecompensation

int

之前设置的曝光补偿值。

fail返回错误码:

错误码

说明

300

设备无法获取设置的曝光补偿值。

[h2]getSupportedSceneModes(OBJECT)(1080+)

使用该方法,可以获取支持的场景模式。

OBJECT参数说明:

参数

类型

是否必填

说明

success

function

否

成功回调。

fail

function

否

失败回调。

complete

function

否

执行结束后的回调。

success返回值:

参数

类型

说明

supportedscenemodes

array

  • 如果获取支持的场景模式成功,则返回类似数组['auto','action','portrait','landscape','night','theatre','beach','snow','sunset','steadyphoto','fireworks','sports','party','candlelight','barcode'] 。
  • 如果获取支持的场景模式失败,则返回 ['auto'] 。

fail返回错误码:

错误码

说明

300

设备无法获取支持的场景模式。

[h2]startRecord(OBJECT)(1090+)

使用该方法,可以启动录像。

OBJECT参数说明:

参数

类型

是否必填

说明

quality

string

否

视频质量,取值包括high、low和normal。默认值为normal。

success

function

否

成功回调。

fail

function

否

失败回调。

complete

function

否

执行结束后的回调。

maxduration

int

否

最大录像时长,单位为秒。默认值为600秒。

compressed

boolean

否

是否启用视频压缩。默认值为false。

timeoutCallback

function

否

录像超时回调,返回uri和thumbPath。

success返回值:

参数

类型

说明

uri

string

视频路径。

thumbPath

string

第一个视频缩略图的路径。

fail返回错误码:

错误码

说明

201

用户拒绝授权相机权限。

[h2]stopRecord(OBJECT)(1090+)

使用该方法,可以停止录像。

OBJECT参数说明:

参数

类型

是否必填

说明

success

function

否

成功回调。

fail

function

否

失败回调。

complete

function

否

执行结束后的回调。

success返回值:

参数

类型

说明

uri

string

视频路径。

thumbPath

string

第一个视频缩略图的路径。

fail返回错误码:

错误码

说明

201

用户拒绝授权相机权限。

示例代码

<template>
    <!-- There can only be one root node in the template -->
    <div class="container" style=" width: 100%; height:100%">
        <stack class="stack" style=" width: 100%; height:100%">
            <camera 
                id="camera" 
                style=" width: 600px; height:600px" 

                deviceposition="{{devicepositionVal}}" 
                flash="{{flashVal}}"
                autoexposurelock="{{autoExposureLockVal}}" 
                autowhitebalancelock="{{autoWhiteBalanceLockVal}}"
                framesize="{{frameSizeVal}}"

                onerror="error"
                oncamerainitdone="cameraInitDoneEvent" 
                oncameraframe="cameraFrameEvent">
            </camera>
            <div class="item-container">
                <input class="btn" type="button" onclick="takePhoto" value="takePhoto"></input>
                <input id="deviceposition-private-css" class="btn" type="button" value="改变deviceposition" onclick="devicepositionEvent" />
                <input id="flash-private-css" class="btn" type="button" value="改变flash" onclick="flashEvent" />
                <input id="framesize-private-css" class="btn" type="button" onclick="changeFrameSize" value="framesize"></input>
                <input id="autowhitebalancelock-private-css" class="btn" type="button" onclick="changeWhiteBalanceLock" value="AWB lock"></input>
                <input id="autoexposurelock-private-css" class="btn" type="button" onclick="changeExposureLock" value="AE lock"></input>
                <image src="{{photoUri}}"></image>
            </div>
        </stack>
    </div>
</template>

<style>
    @import '../../../common/css/common.css';

    .stack {
      height: 300px;
      align-items: flex-start;
    }

    .title {
      font-size: 100px;
    }

    .btn {
        font-size: 10px;
        margin-left: 5px;
        margin-right: 5px;
        width: 100px;
        height: 50px;
    }
</style>

<script>

    export default {
        data: {
            title: 'camera',
            photoUri: "",
            devicepositionIndex: 0,
            devicepositionVal: "",
            flashIndex: 0,
            flashVal: "",
            autoexposurelockIndex:0,
            autoExposureLockVal:"",
            autoWhiteBalanceLockIndex:0,
            autoWhiteBalanceLockVal:"",
            frameSizeIndex:0,
            frameSizeVal:"",
        },
        onInit() {
            this.$page.setTitleBar({
                text: 'menu',
                textColor: '#ffffff',
                backgroundColor: '#007DFF',
                backgroundOpacity: 0.5
            })
        },
        onReady() {

        },
        devicepositionEvent() {
            if (this.devicepositionIndex === 0) {
                this.devicepositionVal = "front"
            } else if (this.devicepositionIndex === 1) {
                this.devicepositionVal = "back"
            }
            this.devicepositionIndex++
        },
        flashEvent() {
            if (this.flashIndex === 0) {
                this.flashVal = "auto"
            } else if (this.flashIndex === 1) {
                this.flashVal = "on"
            } else if (this.flashIndex === 2) {
                this.flashVal = "off"
            } else if (this.flashIndex === 3) {
                this.flashVal = "torch"
            }
            this.flashIndex++
        },
        takePhoto() {
            var camera = this.$element('camera');
            //camera.flash = "flash_on";
            console.log("take photo =" + camera.flash);
            camera.takePhoto({
                quality: "high",
                success: (res) => {
                    console.log("res =" + res.uri);
                    this.photoUri = res.uri;
                },
                fail: (erromsg, errocode) => {
                    console.log('media.takePhoto----------' + errocode + ': ' + erromsg)
                }
            })
        },
        error(e) {
            console.error(e.detail)
        },
        cameraInitDoneEvent(data){
            console.log(data)
        },
        cameraFrameEvent(data){
            console.log(data)
        },
        changeFrameSize(){
            const camera = this.$element('camera')
            if(this.frameSizeIndex === 0){
                this.frameSizeVal = "low"
                this.frameSizeIndex = 1
            }else if(this.frameSizeIndex === 1){
                this.frameSizeVal ="normal"
                this.frameSizeIndex = 2
            } else if(this.frameSizeIndex === 2){
                this.frameSizeVal = "high"
            }
        },
        changeWhiteBalanceLock(){
            if(this.autoWhiteBalanceLockIndex === 0){
                this.autoWhiteBalanceLockVal = "true"
                this.autoWhiteBalanceLockIndex = 1
            }else if(this.autoWhiteBalanceLockIndex === 1){
                this.autoWhiteBalanceLockVal ="false"
            }
        },
        changeExposureLock(){
            if(this.autoexposurelockIndex === 0){
                this.autoExposureLockVal = "true"
                this.autoexposurelockIndex=1
            }else if(this.autoexposurelockIndex === 1) {
                this.autoExposureLockVal = "false"
            }
        }

    }
</script>

示例代码效果图:

版本更新说明

版本

发布日期

描述

1090

2022-05-19

新增startRecord和stopRecord方法。

1080

2021-12-28

  • 新增 framesize、autoexposurelock 和 autowhitebalancelock 属性
  • 新增 cameraframe 和 camerainitdone 事件
  • 新增 setPreviewFpsRange、getSupportedPreviewFpsRange、getPreviewFpsRange、setExposureCompensation、getExposureCompensationRange 、getExposureCompensation 和 getSupportedSceneModes 方法

1070

2020-05-19

新增 autoorientation 属性,用于设置图片是否随设备重力方向发生变化调整。

1040

2019-06-24

第一次正式发布。

Tips