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


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 相关文章推荐
替代window.event.srcElement效果的可兼容性的函数
Dec 18 Javascript
Javascript中正则表达式的全局匹配模式分析
Apr 26 Javascript
jquery.messager.js插件导致页面抖动的解决方法
Jul 14 Javascript
swtich/if...else的替代语句
Aug 16 Javascript
jqueryMobile使用示例分享
Jan 12 Javascript
总结JavaScript设计模式编程中的享元模式使用
May 21 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
May 24 Javascript
js时间戳格式化成日期格式的多种方法介绍
Feb 16 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
Aug 24 Javascript
JS实现字符串翻转的方法分析
Aug 31 Javascript
vue+koa2实现session、token登陆状态验证的示例
Aug 30 Javascript
如何让vue长列表快速加载
Mar 29 Vue.js
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解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
基于jquery的页面划词搜索JS
2010/09/14 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
js+css实现回到顶部按钮(back to top)
2016/03/02 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
2019/04/22 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
详解Python自建logging模块
2018/01/29 Python
Python之列表的插入&amp;替换修改方法
2018/06/28 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
信息管理专业推荐信
2013/10/29 职场文书
中医专业应届生求职信
2013/11/17 职场文书
计算机毕业生求职信
2014/06/10 职场文书
应届生自荐书
2014/06/23 职场文书
我的中国梦演讲稿小学篇
2014/08/19 职场文书
教师自我剖析材料(四风问题)
2014/09/30 职场文书
群众路线党员个人整改措施
2014/10/27 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
行政处罚告知书
2015/07/01 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
Nginx本地配置SSL访问的实例教程
2022/05/30 Servers