您好,登錄后才能下訂單哦!
微信小程序最近非常火熱,小編最近做了一個新項目,使用小程序開發考試系統,在使用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" ></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" ></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) }, })
總結
以上所述是小編給大家介紹的微信小程序調用攝像頭隱藏式拍照功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。