微信小程序调用摄像头隐藏式拍照功能


Posted in Javascript onAugust 22, 2018

微信小程序最近非常火热,小编最近做了一个新项目,使用小程序开发考试系统,在使用App参加考试的时候调用摄像头抓拍用户是否作弊,在开发过程中遇到点问题,下面小编把问题描述和解决方法分享给大家,具体内容如下:

问题

今天小编遇到了这么个问题,就是在用户使用App参加考试的时候调用摄像头抓拍用户是否作弊,其实这也没什么,关键在于不能打扰用户考试,不能被用户发现什么时候抓拍的,也不能给用户查看图片,只有考完是后才能查看。这系统相当于考驾照时的上机答题部分。开始经理的要求是调用小程序外部的手机拍摄功能,这要可把我吓的够呛。

 解决方法

遇到这种问题肯定要先找下官网的帮助文档,于是找到了调用摄像头的这么一个模块

相机组件控制 (wx.createCameraContext)

说明:

创建并返回 camera 上下文 cameraContext 对象,cameraContext 与页面的 camera 组件绑定,一个页面只能有一个camera,通过它可以操作对应的 <camera/> 组件。 在自定义组件下,第一个参数传入组件实例this,以操作组件内 <camera/> 组件

cameraContext 对象的方法列表:

takePhoto OBJECT 拍照,可指定质量,成功则返回图片
startRecord OBJECT 开始录像
stopRecord OBJECT 结束录像,成功则返回封面与视频

takePhoto 的 OBJECT 参数列表:

quality String 成像质量,值为high, normal, low,默认normal
success Function 接口调用成功的回调函数 ,res = { tempImagePath }
fail Function 接口调用失败的回调函数
complete Function 接口调用结束的回调函数(调用成功、失败都会执行)

这不是有个拍照功能的模块吗,于是去找了一下官网所给的代码研究了一下:

官网代码:

wxml代码:

<view class="page-body">
<view class="page-body-wrapper">
<camera device-position="back" flash="off" binderror="error" style="width: 100%; height: 300px;"></camera>
<view class="btn-area">
<button type="primary" bindtap="takePhoto">拍照</button>
</view>
<view class="btn-area">
<button type="primary" bindtap="startRecord">开始录像</button>
</view>
<view class="btn-area">
<button type="primary" bindtap="stopRecord">结束录像</button>
</view>
<view class="preview-tips">预览</view>
<image wx:if="{{src}}" mode="widthFix" src="{{src}}"></image>
<video wx:if="{{videoSrc}}" class="video" src="{{videoSrc}}"></video>
</view>
</view>

js代码:

Page({
onLoad() {
this.ctx = wx.createCameraContext()
},
 
takePhoto() {

this.ctx.takePhoto({


quality: 'high',


success: (res) => {



this.setData({




src: res.tempImagePath



})


}

})
},
 
startRecord() {

this.ctx.startRecord({


success: (res) => {



console.log('startRecord')


}

})
},
 
stopRecord() {

this.ctx.stopRecord({


success: (res) => {



this.setData({




src: res.tempThumbPath,




videoSrc: res.tempVideoPath



})


}

})
},
error(e) {

console.log(e.detail)
}
})

wxcss代码:

.preview-tips {
margin: 20rpx 0;
}
.video {

margin: 50px auto;

width: 100%;

height: 300px;
}

这代码修改还是可以的只是不是我想要的那种,我要的是隐藏没有摄像头的,和自动抓拍功能的,

官网代码分析:

<camera device-position="back" flash="off" binderror="error" style="width: 100%; height: 300px;"></camera>

这是摄像头模块,这模块只要不是隐藏,宽高不为0,都可以正常使用拍照功能

this.ctx = wx.createCameraContext()

这是获取摄像头图像功能 

takePhoto() {
this.ctx.takePhoto({


quality: 'high',


success: (res) => {



this.setData({




src: res.tempImagePath



})


}

})
},

这是拍照功能,并没有和摄像头一起使用,只要创建了摄像头并不隐藏的情况下可以单独调用 

就这几行代码就差不多可以实现我想要的功能了,拍照功能单独用定时器来调用,只差一个隐藏摄像头的功能了,在官网上找找。有没有新发现......

在组件里发现有这么一个模块叫 

cover-view

描述:覆盖在原生组件之上的文本视图,可覆盖的原生组件包括map、video、canvas、camera、live-player、live-pusher,只支持嵌套cover-view、cover-image,可在cover-view中使用button。 

这模块的意思是说cover-view 可以覆盖掉camera这控件

camera这模块也是这么个奇葩的存在,你用z-index层次不管多大都无法覆盖掉,这里就要用到cover-view组件了

一开始我也不知道怎么用,于是上网查了查,博友们都是这么说的 cover-view 嵌套到 camera 里面去就行了,

也就是这么个意思

<camera>
<cover-view></cover-view>
</camera>

这样效果是可以但太占空间了 于是我就把<camera>宽高设成了

width: 10rpx;
height: 14rpx; 

只要不隐藏不为0都是可以的拍照的清晰度没有变化只有宽高比例有变化

同样<cover-view>也要把摄像机铺满,背景色调为周围一样的颜色这就相当于隐藏摄像头功能了,再加上定时器抓拍就完成了这项功能。 

完成代码:

wxml代码:

<view class="page-body">
<view class="page-body-wrapper">
<camera device-position="front" flash="off" binderror="error" class="camera" bindstop='bindstop' binderror='binderror'>
<cover-view class='border_writh'></cover-view>
</camera>
<view class="btn-area">
<button type="primary" bindtap="stoptime">停止</button>
</view>
<view class="preview-tips">预览</view>
<image wx:if="{{src}}" mode="widthFix" src="{{src}}"></image>
</view>
</view>

wxss代码:

.preview-tips {
margin: 20rpx 0;
}
.video {

margin: 50px auto;

width: 100%;

height: 300rpx;
}
.border_writh{

width: 30rpx;

height: 30rpx;

background-color:#1aad19;
}
.camera{

position: absolute;

top: 5rpx;

left: 5rpx;

width: 10rpx;

height: 14rpx;
}

js代码:

var time = null;
Page({
/**
* 页面的初始数据
*/
data: {
},
onLoad() {
},
//定时器拍照
setTime: function() {
let that = this

let ctx = wx.createCameraContext()

time = setInterval(function() {


if (Math.round(Math.random()) == 1) {



console.log('拍照')



//拍照



ctx.takePhoto({




quality: 'high',




success: (res) => {





console.log(res.tempImagePath)





that.setData({






src: res.tempImagePath





})





that.localhostimgesupdata(res.tempImagePath)




}



})


}

}, 1000 * 10) //循环间隔 单位ms
},
//图片上传
localhostimgesupdata: function(imgPath) {

console.log('图片上传')

wx.uploadFile({


url: '', /图片上传服务器真实的接口地址


filePath: imgPath,


name: 'imgFile',


success: function(res) {



wx.showToast({




title: '图片上传成功',




icon: 'success',




duration: 2000



})


}

})
},
stoptime: function() {

console.log('定时停止')

clearInterval(time)
},
bindstop: function() {

console.log('非正常停止')
},
binderror: function() {

console.log('用户拒绝授权')
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function() {

console.log('显示')

//定时器

this.setTime();
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function() {

console.log('隐藏')

clearInterval(time)
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function() {

console.log('卸载')

clearInterval(time)
},
})

总结

以上所述是小编给大家介绍的微信小程序调用摄像头隐藏式拍照功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript实现Sleep函数的代码
Mar 04 Javascript
json跟xml的对比分析
Jun 10 Javascript
js prototype截取字符串函数
Apr 01 Javascript
JavaScript 存在陷阱 删除某一区域所有节点
May 10 Javascript
js不能跳转到上一页面的问题解决方法
Mar 01 Javascript
angularjs实现与服务器交互分享
Jun 24 Javascript
JS截取与分割字符串常用技巧总结
Nov 10 Javascript
深入探究AngularJS框架中Scope对象的超级教程
Jan 04 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
Sep 24 Javascript
jQuery 开发之EasyUI 添加数据的实例
Sep 26 jQuery
js实现同一个页面,多个enter事件绑定的示例
Oct 10 Javascript
Angular7创建项目、组件、服务以及服务的使用
Feb 19 Javascript
Vue2.2.0+新特性整理及注意事项
Aug 22 #Javascript
Vue之mixin全局的用法详解
Aug 22 #Javascript
React中使用UEditor百度富文本的方法
Aug 22 #Javascript
VUE 全局变量的几种实现方式
Aug 22 #Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
Aug 22 #Javascript
基于vue.js中关于下拉框的值默认及绑定问题
Aug 22 #Javascript
微信小程序有旋转动画效果的音乐组件实例代码
Aug 22 #Javascript
You might like
强烈推荐:php.ini中文版(1)
2006/10/09 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
JS删除字符串中重复字符方法
2014/03/09 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
js判断当前页面用什么浏览器打开的方法
2016/01/06 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
2016/05/12 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python中的True,False条件判断实例分析
2015/01/12 Python
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
python安装gdal的两种方法
2019/10/29 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
母亲节感恩寄语
2014/02/21 职场文书
篮球赛口号
2014/06/18 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android