热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

这篇文章主要介绍了微信小程序调用摄像头隐藏式拍照功能,本文给大家带来了解决方法、官网代码和小编写的比较完整代码,需要的朋友可以参考下

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

问题

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

 解决方法

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

相机组件控制 (wx.createCameraContext)

说明:

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

cameraContext 对象的方法列表:

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

takePhoto 的 OBJECT 参数列表:

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

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

官网代码:

wxml代码:













预览




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;
}

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

官网代码分析:


这是摄像头模块,这模块只要不是隐藏,宽高不为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 里面去就行了,

也就是这么个意思


  
 

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

width: 10rpx;
height: 14rpx; 

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

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

完成代码:

wxml代码:









预览


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)
},
})

总结

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


推荐阅读
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文详细介绍了如何使用 PHP 接收并处理微信支付的回调结果,确保支付通知能够被正确接收和响应。 ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • 微信小程序:授权登录与手机号绑定
    本文详细介绍了微信小程序中用户授权登录及绑定手机号的流程,结合官方指引和实际开发经验,提供了一套完整的实现方案,帮助开发者更好地理解和应用。 ... [详细]
  • 在项目中使用 Redis 时,了解其不同架构模式(如单节点、主从复制、哨兵模式和集群)对于确保系统的高可用性和扩展性至关重要。本文将详细探讨这些模式的特点和应用场景。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 深入理解小程序中的Picker组件
    Picker组件是一种从屏幕底部弹出的滚动选择器,支持多种选择模式,包括普通选择器、多列选择器、时间选择器、日期选择器和省市区选择器。本文将详细介绍Picker的各种属性及其应用场景。 ... [详细]
  • 本文探讨了在C语言编程中,如何有效避免多文件项目中的重定义问题,通过合理使用预处理器指令和extern关键字,确保代码的健壮性和可维护性。 ... [详细]
author-avatar
主宰魔尊_164
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有